As others have already pointed out, the enum pattern is now widely considered a better approach to the Singleton vs. the old-school method, but I just wanted to point out a drawback.
We had a Singleton in the form of:
public enum Foo {
    INSTANCE;
}
that had been around for awhile, working just fine. Then during a code review, we saw this:
public enum Foo {
    INSTANCE,
    ANOTHER;
}
After we smacked him across the face with a wet mackerel, the coder in question had seen the error of his ways, and a larger than small amount of code had to be backed out and/or rewritten.  Yes, we caught it before it went out into production, but work had to be done to erase it.
I feel that this a weakness of this type of Singleton (albeit small and perhaps rare) vs. the old-school way.  Yes, you can break any pattern by implementing it wrong, but it seems a whole heck of a lot easier for a coder to break an enum Singelton than a well-formed old-school Singleton.
EDIT:
For completeness, here's an enum Singleton that guards against additional values getting added later:
public enum Foo
{
  INSTANCE;
  // adding another type here will cause a runtime
  static
  {
    if (Foo.values().length != 1)
    {
      throw new IllegalStateException("Not a Singleton.");
    }
  }
}