Some points I found interesting:
Avoid nagscreens or "Gotcha!" messages - this is what crackers are searching first. They will never dig through the 300K ASM instructions of your program - instead, they are first searching the location of nagscreens or your "Your evaluation time has expired!" message and start cracking there (see below for more tips about that). In some cases, it's even enough to remove the form resource from the EXE and it will show no nagscreen anymore - without any bug showing up! If you really need such a nagscren, you should build it dynamically at runtime, and generally, the only method to show the user that he is unregistered should be in the "about" dialog (some programmers also have the philosophy that nagscreens might cause your users to hate your app which would then also be very stupid).
Store serial numbers in unlikely places like as a property of a database field. Often heard and read: "..give it a DLL file name and store it in the System directory." Too often heard, don't use it. ;-)
Store serial numbers in several places. <--- Good point!