IIRC the standard/historic behavior is that an object can retain itself in the -dealloc method, to extend its own lifetime, and I guess that the singletons do that (I haven't checked).
I think that behavior changed for ARC, so it could be that the runtime is performing an ARC style deallocation when it should be calling NSDeallocateObject() (or something odd is going on in the NSDeallocateObject() function).