The implementation is actually a mix between your two approaches. The compiler compiles references to static variables and methods into special bytecodes that specifically denote that the reference or call is static. Then when the JVM executes the bytecodes, it knows to look up the static variables or methods in the class definition, rather than in an object instantiation.
More detail can be found here: http://mrl.nyu.edu/~meyer/jvmref/ref--19.html
(Definition of the bytecode for retrieving a static class member.)
After reading up on this subject, I'm still confused how different classloaders fit into the situation. Does a class loaded by two different classloaders have two instances of static member variables? How does the getstatic bytecode know which classloaders to use -- does it always use the system classloader? If anyone else has information on this, I'd love to hear it.