I'm a little concerned about the example here. Shouldn't CountClass's static method SafeInstanceCount() return Interlocked.Read(ref safeInstanceCount)? Otherwise, while the actual value of safeInstanceCount may be consistent (zero - after all instances have been finalized by the garbage collector,) the main thread may not see the latest value.
Could this specific issue be solved by making safeInstanceCount volatile (as well as using the Interlocked methods?)