OK, here is an interesting Bug D1 (I have a feeling this happened to me with 3.0.1 also)...
I had my phone go from 50% battery directly down to 20%. Then after a bit it hit 15% and the phone rebooted. But, it was stuck in a bootloop that reboots after about 20 seconds (Preparing SD Card).
This happened to me in 3.0.1 once and I gave up and went back to my 2.5.0 Backup. It happened to me a few days ago with 3.1.1. I had to wipe and reload 3.1.1 to get the phone working again.
It just happened to me again. But this time using adb and debugging the boot I noticed an error displaying with the WiFi Driver and interface. I had the WiFi turned On when the original reboot happened.
I copied the settings.db file off the phone while in recovery boot and modified the setting with sqlite to turn the WiFi off and pushed the settings.db back onto the phone.
Rebooted and the phone came up clean, no more bootloop.
I'll point out that I put in a fully charged battery (I keep a spare fully charged always) after the bootloops started and it did not clear it. So, it's not caused because the battery is too low.
When I turn on the WiFi interface this shows in the Debug and the phone starts is bootloop...
E/Tethering( 1142): attempting to remove unknown iface (tiwlan0), ignoring
Update :
Restored the base boot.img I made after a clean 3.1.1 install (thus restoring the original kernel) and cleared the /system/lib/modules directory and copied the originals from the 3.1.1 install zip.
Now WiFi and everything is fine. I was running the Raidzero 1Ghz Kernel. Something with the modules it installed did not play well with the WiFi interface in the phone.