1. No boot partition size limit. No more 4GB partition Hard Disk limit crap. I know this was fixed with some patches in AmigaOS 3.5 and 3.9, but if you needed to boot without Startup-Sequence, it can destroy your boot partition if it is bigger than 4GB. I know a friend who had 24 partitions in a 100GB hard drive. Painful to sort.
For instance Phase5 products all support 64bit directly, so there are no such issues. Works even with KS 3.0.
2. No more FastFileSystem crap. You can use SFS for boot partition on AmigaOS 4.
You can use SFS boot partition with AmigaOS 3.x as well. Actually you really should use PFS3 with AmigaOS 3.x though (it's becoming freeware, too) :-)
3. Virtual Memory. No more usage of simple and dangerous to the system MMU hacks.
Whether virtual memory is dangerous or not depends on the applications you run. VMM worked just fine even with KS 3.0 and 68030 already.
4. No more need for third party software to connect to the Internet.
AmigaOS 3.9 includes AmiTCP/IP, but admittedly with a questionable license.
7. GrimReaper - if a program is not stripped, the Grim tells a lot about the reasons for the message to appear. This is very handy for developers. On AmigaOS 3.9 I used MMULib/MuTools and MuForce (Enforcer alike program), but the GRIM is much much better.
SmartCrash provided the functionality years ago already for AmigaOS 3.x. Okay it wasn't included with the OS, I admit. But there's nothing special about Grim Reaper itself.
10. No more need to put commodities and programs in WBStartup and manage AmigaOS startup with hacks like WBStartup/Enabled and WBStartup/Disabled or similar. The new startup modules management is very nice.
I remember reading some stark criticism about this new system, too.
12. SObjects - shared objects. Some programs use them. Additional plus of AmigaOS 4.
It's easy to create normal amiga shared libraries with per caller data. bsdsocket.library is a common example, every AmigaOS 3.x installation with a networking installed has such library installed. The added bonus is that you don't need to load the code in memory for every caller, like you have to with AmigaOS 4 SObjects.