Today, EEPROM.write() uses:
eeprom_write_byte((unsigned char *) address, value);
I'd suggest changing this from eeprom_write_byte() to eeprom_update_byte(). This will save a write to the EEPROM in the event that the byte is already set to what it needs to be. This is at the expense of needing to read the byte, which will slow things down, but I would think someone who truly needs ever picosecond could use the native AVR library function - and this might save some beginner's AVR chip.
Both read() and write()'s documentation indicates that there are 512 bytes of EEPROM. On the ATMega328P, there's 1024 bytes, which are all accessible fine via this library (I verified).
Also, the write() documentation indicates:
The datasheet also specifies that a write cycle takes 3.3 ms to complete. Other EEPROM write and read requests will fail if executed in this time period. This delay appears to be built into the EEPROM library as a casual test shows each cycle taking 3.33 ms to execute.
This is slightly incorrect. The first write() will always return very quickly (not 3.3 ms). However, if you execute a read() or a write() before 3.3ms of wall time has elapsed, that new operation will block until the time has elapsed (another reason to consider the update form of the native function in write() - it may be faster if the bytes haven't actually changed).