diff --git a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
index d3b0bc5..fb752ef 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.javac;
 
 import com.google.gwt.dev.jdt.TypeRefVisitor;
+import com.google.gwt.dev.jjs.InternalCompilerException;
 import com.google.gwt.dev.util.Name.BinaryName;
 import com.google.gwt.dev.util.collect.Lists;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
@@ -60,10 +61,12 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.JarURLConnection;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -71,6 +74,8 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 /**
  * Manages the process of compiling {@link CompilationUnit}s.
@@ -130,6 +135,51 @@
     void process(CompilationUnitBuilder builder,
         CompilationUnitDeclaration cud, List<CompiledClass> compiledClasses);
   }
+
+  /**
+   * Static cache of all the JRE package names.
+   */
+  public static class JreIndex {
+    private static Set<String> packages = readPackages();
+
+    public static boolean contains(String name) {
+      return packages.contains(name);
+    }
+
+    private static void addPackageRecursively(Set<String> packages, String pkg) {
+      if (!packages.add(pkg)) {
+        return;
+      }
+
+      int i = pkg.lastIndexOf('/');
+      if (i != -1) {
+        addPackageRecursively(packages, pkg.substring(0, i));
+      }
+    }
+
+    private static Set<String> readPackages() {
+      HashSet<String> pkgs = new HashSet<String>();
+      String klass = "java/lang/Object.class";
+      URL url = ClassLoader.getSystemClassLoader().getResource(klass);
+      try {
+        JarURLConnection connection = (JarURLConnection) url.openConnection();
+        JarFile f = connection.getJarFile();
+        Enumeration<JarEntry> entries = f.entries();
+        while (entries.hasMoreElements()) {
+          JarEntry e = entries.nextElement();
+          String name = e.getName();
+          if (name.endsWith(".class")) {
+            String pkg = Shared.getSlashedPackageFrom(name);
+            addPackageRecursively(pkgs, pkg);
+          }
+        }
+        return pkgs;
+      } catch (IOException e) {
+        throw new InternalCompilerException("Unable to find JRE", e);
+      }
+    }
+  }
+
   /**
    * Adapts a {@link CompilationUnit} for a JDT compile.
    */
@@ -282,7 +332,10 @@
     }
 
     private boolean isPackage(String slashedPackageName) {
-      // Include class loader check for binary-only annotations.
+      // Test the JRE explicitly, because the classloader trick doesn't work.
+      if (JreIndex.contains(slashedPackageName)) {
+        return true;
+      }
       if (packages.contains(slashedPackageName)) {
         return true;
       }
@@ -294,6 +347,7 @@
         addPackages(slashedPackageName);
         return true;
       }
+      // Include class loader check for binary-only annotations.
       if (getClassLoader().getResource(resourceName) != null) {
         addPackages(slashedPackageName);
         return true;
diff --git a/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java b/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
index 4ff010b..fce859f 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
@@ -22,7 +22,6 @@
 import com.google.gwt.dev.javac.GWTProblem;
 import com.google.gwt.dev.javac.JdtCompiler;
 import com.google.gwt.dev.javac.Shared;
-import com.google.gwt.dev.jjs.InternalCompilerException;
 import com.google.gwt.dev.util.CharArrayComparator;
 import com.google.gwt.dev.util.Empty;
 import com.google.gwt.dev.util.Util;
@@ -52,19 +51,14 @@
 import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
 import org.eclipse.jdt.internal.compiler.util.Messages;
 
-import java.io.IOException;
-import java.net.JarURLConnection;
 import java.net.URL;
 import java.util.Comparator;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 
 /**
  * A facade around the JDT compiler to manage on-demand compilation, caching
@@ -338,47 +332,6 @@
       }
     }
 
-    static class JreIndex {
-      private static Set<String> packages = readPackages();
-
-      private static void addPackageRecursively(Set<String> packages, String pkg) {
-        if (!packages.add(pkg)) {
-          return;
-        }
-
-        int i = pkg.lastIndexOf('.');
-        if (i != -1) {
-          addPackageRecursively(packages, pkg.substring(0, i));
-        }
-      }
-
-      public static boolean contains(String name) {
-        return packages.contains(name);
-      }
-
-      private static Set<String> readPackages() {
-        HashSet<String> pkgs = new HashSet<String>();
-        String klass = "java/lang/Object.class";
-        URL url = ClassLoader.getSystemClassLoader().getResource(klass);
-        try {
-          JarURLConnection connection = (JarURLConnection) url.openConnection();
-          JarFile f = connection.getJarFile();
-          Enumeration<JarEntry> entries = f.entries();
-          while (entries.hasMoreElements()) {
-            JarEntry e = entries.nextElement();
-            String name = e.getName();
-            if (name.endsWith(".class")) {
-              String pkg = Shared.getPackageNameFromBinary(name);
-              addPackageRecursively(pkgs, pkg);
-            }
-          }
-          return pkgs;
-        } catch (IOException e) {
-          throw new InternalCompilerException("Unable to find JRE", e);
-        }
-      }
-    }
-
     private class INameEnvironmentImpl implements INameEnvironment {
 
       public INameEnvironmentImpl() {
@@ -483,9 +436,8 @@
       private boolean isPackage(ClassLoader classLoader, String packageName) {
         String packageAsPath = packageName.replace('.', '/');
 
-        // Test the JRE explicitly first, because the following method does
-        // not work for JRE classes.
-        if (JreIndex.contains(packageName)) {
+        // Test the JRE explicitly, because the classloader trick doesn't work.
+        if (JdtCompiler.JreIndex.contains(packageAsPath)) {
           return true;
         }
 
