The first ROM devices had to have information placed in them via some mechanical, photolithographic, or other means (before integrated circuits, it was common to use a grid where diodes could be selectively installed or omitted). The first major improvement was a "fuse-PROM"--a chip containing a grid of fused diodes, and row-drive transistors that were sufficiently strong that selecting a row and forcing the state of the output one could blow the fuses on any diodes one didn't want. Although such chips were electrically writable, most of the devices in which they would be used did not have the powerful drive circuitry necessary to write to them. Instead, they would be written using a device called a "programmer", and then installed in the equipment that needed to be able to read them.
The next improvement was an implanted-charge memory device, which allowed charges to be electrically implanted but not removed. If such devices were packaged in UV-transparent packages (EPROM), they could be erased with about 5-30 minutes' exposure to ultraviolet light. This made it possible to reuse devices whose contents were found not to be of value (e.g. buggy or unfinished versions of software). Putting the same chips in an opaque package allowed them to be sold more inexpensively for end-user applications where it was unlikely anyone would want to erase and reuse them (OTPROM). A succeeding improvement made it possible to erase the devices electrically without the UV light (early EEPROM).
Early EEPROM devices could only be erased en masse, and programming required conditions very different from those associated with normal operation; consequently, as with PROM/EPROM devices, they were generally used in circuitry which could read but not write them. Later improvements to EEPROM made it possible to erase smaller regions, if not individual bytes, and also allowed them to be written by the same circuitry that used them. Nonetheless, the name did not change.
When a technology called "Flash ROM" came on the scene, it was pretty normal for EEPROM devices to allow individual bytes to be erased and rewritten within an application circuit. Flash ROM was in some sense a step back functionally since erasure could only take place in large chunks. Nonetheless, restricting erasure to large chunks made it possible to store information much more compactly than had been possible with EEPROM. Further, many flash devices have faster write cycles but slower erase cycles than would be typical of EEPROM devices (many EEPROM devices would take 1-10ms to write a byte, and 5-50ms to erase; flash devices would generally require less than 100us to write, but some required hundreds of milliseconds to erase).
I don't know that there's a clear dividing line between flash and EEPROM, since some devices that called themselves "flash" could be erased on a per-byte basis. Nonetheless, today's trend seems to be to use the term "EEPROM" for devices with per-byte erase capabilities and "flash" for devices which only support large-block erasure.
If you speak in general terms the primary difference between flash and EE prom is simply architectural with respect to the data access, the actual write/erase mechanism is identical at the cell level. What circuits wrap around those cells for moving the bits to and from the cell, how parallel the operation is and how many happen at the same time is where the real differences lie. So an accurate statement would be , if you've implemented a FAMOS or FGMOS cell can you make a flash or an EEPROM chip from that, and the answer would be yes.
But be aware it will be hard to compare various EEPROMS to Flash devices simply because of the differences in the process technology, the process capabilities and it's wear resiliency.
EEPROMS tend to be small and so tend to be more robust and designed for longer term storage which affects the process design. On the other end you can see that there is multilevel Flash with is optimized for bit density. this is yet another optimization.
All floating gate cells are characterized by their usage of Fowler-Nordheim (F-N) Tunnelling for the injection of the charge into the floating gate through the Gate oxide. F-N tunnelling in turn is characterized by Quantum Mechanical tunnelling through a triangular potential well under high electric fields. The point here is that tunnelling is inherently damaging to the gate oxide and leaves residual evidence. The solution recommended above is to ensure that each cell is worn out the same amount so you can't go back read the evidence of what was there - when put that way it does really seem like such a good idea.
Very few people/labs have the ability to strip apart a die and read the residual damage in the floating gate device that has been erased. It is possible, certainly, but it won't be through probing the device and it would be very difficult. It would be best to capture the device with charge still in the gate (but this poses different problems in itself).
Best Answer
"EEPROM" is typically used to store relatively smaller amounts of code. This is due to the evolution of ROM technologies:
PROM (Programmable Read-Only Memory) or OTP (one-time programmable) is the oldest type of ROM. These were commonly used in video console cartridges where programmable (and non-modifiable) code was desired. Storage was quite limited, usually measured in bits, and they appeared as "regular integrated circuits." Their retention is very long, but each bit takes up a large area, so producing an IC with large storage capabilities is challenging.
EPROM (Erasable PROM) was the successor to PROM in many ways, however often only differed by the silicon die being visible through a quartz window on top of the chip. Exposing the die to ultraviolet light reset all of the stored bits and it could be programmed again, a limited number of times. These were once used for computer BIOSes, since "upgrading it" meant the ROM just had to be erased and reprogrammed. Their retention is good[1], however are susceptible to accidental erasure.
EEPROM (electrically-erasable PROM) was the successor to EPROM by allowing the erasure to be done electrically, no longer requiring UV lamps and removing/reinstalling the IC. These too, worked more with bits than bytes or larger units of storage and were quite limited. Retention is quite good[2], but each bit still takes up quite a bit of space physically, making large volumes of storage impractical.
FLASH ROM, is the successor to all of these. They are a ROM in the sense that writing data is "permanent" (reality: 10 to 50 years retention[3] or so) but are erasable and reprogrammable. The biggest difference between FLASH and EEPROM is that FLASH is optimized to work on bytes or (blocks/pages) data, so are much faster than EEPROM. This lends them to mass-storage roles more readily than an EEPROM would, and that is why they proliferate the removable media market currently. They also found a way to cram more bits into a given area, increasing the storage density. However as a trade-off, the durability of each bit is lessened.
Now a PIC microcontroller typically has FLASH code memory, and optionally a little bit of EEPROM for general-purpose storage.
The main difference between these on the PIC, and what you want to know is: The FLASH write/erase endurance is about 10,000 times per bit. After that, this bit will be "dead" and no longer usable. The EEPROM write/erase durability is typically 100,000 cycles per bit. The retention seems to decline with the number of write/erase cycles, but finding data on this is very difficult.
[1] "[EPROM] retention in excess of 5 years at 225°C." http://www.northropgrumman.com/Capabilities/RadiationHardenedEEPROMS/Documents/256k_eeprom_paper.pdf pg 1.
[2] "[Devices] under testing have demonstrated greater than 10 years at 70ºC upon projection. But, Agency 1 also claims that there is a likelihood of having a sub-population of early failures within the total population, likely to represent no more than 1-in-15 to 1-in-30 devices. Intermittent data retention behavior was observed during the testing, but the cause of this behavior is not understood." https://nepp.nasa.gov/files/16152/05_001%20Chen%20%20EEPROM%20Final%20Report.pdf pg 3-4.
[3] "[Flash] nonvolatility implies at least ten years of charge retention." http://www.engr.sjsu.edu/wdu/ME296N/2006/Lecture/FlashMemory2.pdf pg 7-8.
So the bottom line is, use FLASH for your program code, since that usually doesn't change much (if at all) and there is plenty of space for the program (since it is the FLASH type.) Use the EEPROM area for non-volatile data storage, as it has both better retention, and roughly 10x the durability of FLASH.