I initially had lots of problems with EEPROM until I made a few code changes. Since then, I have had values hold for 3 years. My changes are:

Always issue a delay between successive WRITEs. I use 100uSec.
Make certain that interrupts are disabled during WRITEs.

I don't know if these have any relevance to your code.

Charles Linquist