You seem to be a bit confused about what it means to be thread-safe and reentrant.
Code is thread-safe if it can be executed concurrently and correctly. http://en.wikipedia.org/wiki/Thread-safe
A function is reentrant if it can be started from some thread while some other thread is already executing it. This means that it cannot us static data (data that keeps its state between calls to a function), only local data, it can't lock unique resources (such as the console), and it can't call non-reentrant functions. http://en.wikipedia.org/wiki/Reentrant_(subroutine)
Classes, being data, are not thread-safe simply because that is a concept related to code, not to data.
A singleton's methods are only reentrant if they don't write to the object's members. I think it could work even if they only read OR write, but not both.
A method of a class with static data can be reentrant if the method doesn't use that data.