1) Overloading an operator, without declaring it as a friend, is still considered a member of the class in which it is defined. "Friends" are not members of the class in which they are defined, but they do allow the friend class or function to access private and protected members of the class as if it were a member of the class.
The whole idea behind singletons is that only 1 instance of a resource exists. The only way to ensure that only 1 instance of a resource exists is to declare the resource static, so that all instances refer to the same object.
Since the destructor is not an option (why, I don't know), the only possible ways are member functions, operators, or static functions. Common sense, really. I haven't given this topic much thought, so I might be missing the point here.