By default, ATmega328 used in Arduino (such as Uno or Duemilanove) operates under 5.0V. Sometimes though it is necessary to use 3.3V supply voltage to accommodate peripheral circuits that cannot tolerate 5.0V.
Under most circumstances, by simply lowering the Vcc from 5.0V to 3.3V would work just fine (note, according to the datahseet, the crystal oscillator frequency should not exceed 10 Mhz when operating at 3.3V. But under normal environment conditions, most chips should be able to support a 16 Mhz clock without any issue). Alternatively, you can always play safe by designing your circuit to work with a 8 Mhz crystal and using the 8 Mhz version of the bootloader instead.
One issue of operating under 3.3V is that this operating voltage is pretty close to the brown-out threshold. By default the BODLEVEL2, BODLEVEL0 bits in the extended fuse byte are set in Arduino (efuse=0×05), which corresponds to a brown-out threshold voltage of 2.5 to 2.9V (2.7V typical). This means that when the Vcc dips below the brown-out threshold voltage, the MCU would automatically reset. When operating under 5V, this brown-out voltage threshold should not pose any problem but when operating under 3.3V this voltage becomes much closer to the Vcc. So in situations where the load has a large in-rush current, the Vcc could dip below the brown-out threshold easily and cause the circuit to reset. The severity of this issue depends on the internal resistance and the transient response of the regulator of course.
To alleviate this issue, you can change the fuse bit settings to either BODLEVEL2=1 and BODLEVEL1=1 (efuse=0×06) or disable brown-out detection altogether by setting the extended fuse byte to 0xFF.
The following are the commands to burn the Arduino bootloader onto ATmega328 with brown-out disabled:
avrdude -C avrdude.conf -c duemilanove -p m328p -B 1.0 -u -U lock:w:0x3f:m -U efuse:w:0xFF:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m avrdude -C avrdude.conf -c duemilanove -p m328p -U flash:w:ATmegaBOOT_168_atmega328.hex -U lock:w:0x0f:m