What are the differences between NAND and NOR flash?
NAND flash is cheaper, so you want to use it if you can. The drawback is that it's not as reliable. NAND flash is faster at most operations, with the notable exception being small random access reads. If you want to read a couple bytes from a random address in memory, NOR is faster. For large memory reads, NAND does reasonably well, and actually beats NOR for large enough chunks.

Most embedded operating systems include code to correct the errors in NAND Flash. There are also microcontrollers with hardware error correction. The real problem happens at boot time-- first-level bootloaders don't have error-correcting code, and they haven't configured the memory controller to run hardware ECC yet. It's a bit of a chicken-and-egg problem-- you can't load the ECC code without errors because you haven't loaded the ECC code yet.

To get around this problem, some memory manufacturers will specify a certain region of the chip that is guaranteed to be error free (the first 4 kB, or something like that). You put a bootloader with software ECC there (like U-boot), read it out with no errors, and then use it to read out your OS kernel, correcting errors as you go. You can also store a bootloader in a serial flash, and just use NAND flash for large stuff like an OS kernel or filesystem.

I've found this Atmel application note useful: http://www.atmel.com/dyn/resources/prod_documents/doc6255.pdf