Assuming the singleton is implemented as static methods in a class, or as a static reference (are there other ways?), the singleton can be garbage collected by unloading the classloader that loaded the singleton class, assuming that there are no references from classes in other class loaders (e.g. a common problem is ThreadLocal instances hanging on to references.)
I haven't used GAE, but my guess is that this is what is happening - the classloader is being unloaded. GAE doesn't know this is a singleton - it simply frees the reference to the class loader. For applications in a container, this is ideally the only reference keeping the app in memory (if you are lucky!). Once this is non-reachable, the entire app becomes non reachable and is collected by the garbage collector. Of course, any threads running may have references to app instances, and so will interfere with this, but I'm assuming the container has control over the apps threads and only frees the classloader when there are no requests (i.e. threads) running the app's code.