Nick Gammon also has this solution at Gammon Forum : Electronics : Microprocessors : Interrupts without explicit manipulation of EIFR
Correction:
The improved version below solves this problem by disabling interrupts before doing the attachInterrupt call. Since you are guaranteed that one instruction will be executed after re-enabling interrupts, we are sure that the sleep_cpu call will be done before the interrupt occurs.
#include <avr/sleep.h>
// interrupt service routine in sleep mode
void wake ()
{
sleep_disable (); // first thing after waking from sleep:
detachInterrupt (digitalPinToInterrupt (2)); // stop LOW interrupt on D2
} // end of wake
void sleepNow ()
{
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
noInterrupts (); // make sure we don't get interrupted before we sleep
sleep_enable (); // enables the sleep bit in the mcucr register
attachInterrupt (digitalPinToInterrupt (2), wake, LOW); // wake up on low level on D2
interrupts (); // interrupts allowed now, next instruction WILL be executed
sleep_cpu (); // here the device is put to sleep
} // end of sleepNow
Also, for something which produces a voltage like a piezo sensor, I'd have tended to have an external pull down resistor instead of a pullup, however, if you are now using an op amp to condition the signal, that may not now help.