diff --git a/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java b/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
index cfc559c..7bff82a 100644
--- a/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
+++ b/dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
@@ -53,6 +53,41 @@
       return code;
     }
   };
+  public static final MockJavaResource COLLECTION = new MockJavaResource(
+      "java.util.Collection") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.util;\n");
+      code.append("public interface Collection<E> {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource ENUM = new MockJavaResource(
+      "java.lang.Enum") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("import java.io.Serializable;\n");
+      code.append("public abstract class Enum<E extends Enum<E>> implements Serializable {\n");
+      code.append("  protected Enum(String name, int ordinal) {}\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource EXCEPTION = new MockJavaResource(
+      "java.lang.Exception") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class Exception extends Throwable {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource FOO = new MockJavaResource("test.Foo") {
     @Override
     protected CharSequence getContent() {
@@ -64,6 +99,17 @@
       return code;
     }
   };
+  public static final MockJavaResource IS_SERIALIZABLE = new MockJavaResource(
+      "com.google.gwt.user.client.rpc.IsSerializable") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client.rpc;\n");
+      code.append("public interface IsSerializable {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource JAVASCRIPTOBJECT = new MockJavaResource(
       "com.google.gwt.core.client.JavaScriptObject") {
     @Override
@@ -150,7 +196,8 @@
 
   public static MockJavaResource[] getStandardResources() {
     return new MockJavaResource[] {
-        ANNOTATION, CLASS, JAVASCRIPTOBJECT, MAP, OBJECT, SERIALIZABLE, STRING,
-        SUPPRESS_WARNINGS, THROWABLE};
+        ANNOTATION, CLASS, COLLECTION, ENUM, EXCEPTION, IS_SERIALIZABLE,
+        JAVASCRIPTOBJECT, MAP, OBJECT, SERIALIZABLE, STRING, SUPPRESS_WARNINGS,
+        THROWABLE};
   }
 }
diff --git a/user/test/com/google/gwt/uibinder/parsers/DockLayoutPanelParserTest.java b/user/test/com/google/gwt/uibinder/parsers/DockLayoutPanelParserTest.java
index 027dd80..cc57ca0 100644
--- a/user/test/com/google/gwt/uibinder/parsers/DockLayoutPanelParserTest.java
+++ b/user/test/com/google/gwt/uibinder/parsers/DockLayoutPanelParserTest.java
@@ -98,20 +98,6 @@
 
   private static final String fieldName = "fieldName";
 
-  // TODO(rjrjr) Move this to JavaResourceBase. Have to do it atomically for
-  // all other tests that define their own Enum.
-  private static final MockJavaResource ENUM = new MockJavaResource(
-  "java.lang.Enum") {
-    @Override
-    protected CharSequence getContent() {
-      StringBuffer code = new StringBuffer();
-      code.append("package java.lang;\n");
-      code.append("public abstract class Enum<E extends Enum<E>> {\n");
-      code.append("  protected Enum(String name, int ordinal) {}\n");
-      code.append("}\n");
-      return code;
-    }
-  };
   private static final MockJavaResource MY_UI_JAVA = new MockJavaResource(
       "my.Ui") {
     @Override
@@ -271,7 +257,6 @@
   MockJavaResource[] getUiResources() {
     List<MockJavaResource> rtn = Lists.create(UiJavaResources.getUiResources());
     rtn.add(MY_UI_JAVA);
-    rtn.add(ENUM);
     return rtn.toArray(new MockJavaResource[rtn.size()]);
   }
 
diff --git a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
index 9a2003d..1e187f5 100644
--- a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
+++ b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
@@ -126,56 +126,12 @@
         code));
   }
 
-  private static void addIsSerializable(Set<CompilationUnit> units) {
-    StringBuffer code = new StringBuffer();
-    code.append("package com.google.gwt.user.client.rpc;\n");
-    code.append("public interface IsSerializable {\n");
-    code.append("}\n");
-    units.add(createMockCompilationUnit(
-        "com.google.gwt.user.client.rpc.IsSerializable", code));
-  }
-
-  private static void addJavaLangException(Set<CompilationUnit> units) {
-    StringBuffer code = new StringBuffer();
-    code.append("package java.lang;\n");
-    code.append("public class Exception extends Throwable {\n");
-    code.append("}\n");
-
-    units.add(createMockCompilationUnit("java.lang.Exception", code));
-  }
-
-  private static void addJavaLangThrowable(Set<CompilationUnit> units) {
-    StringBuffer code = new StringBuffer();
-    code.append("package java.lang;\n");
-    code.append("import java.io.Serializable;\n");
-    code.append("public class Throwable implements Serializable {\n");
-    code.append("}\n");
-    units.add(createMockCompilationUnit("java.lang.Throwable", code));
-  }
-
-  private static void addJavaUtilCollection(Set<CompilationUnit> units) {
-    StringBuffer code = new StringBuffer();
-    code.append("package java.util;\n");
-    code.append("public interface Collection<E> {\n");
-    code.append("}\n");
-    units.add(createMockCompilationUnit("java.util.Collection", code));
-  }
-
-  private static void addJavaUtilMap(Set<CompilationUnit> units) {
-    units.add(new SourceFileCompilationUnit(JavaResourceBase.MAP));
-  }
-
   private static void addStandardClasses(Set<CompilationUnit> units) {
     for (Resource resource : JavaResourceBase.getStandardResources()) {
       units.add(new SourceFileCompilationUnit(resource));
     }
     addGwtTransient(units);
-    addJavaUtilMap(units);
     addICRSE(units);
-    addJavaLangException(units);
-    addJavaLangThrowable(units);
-    addJavaUtilCollection(units);
-    addIsSerializable(units);
   }
 
   private static void assertFieldSerializable(SerializableTypeOracle so,
@@ -223,7 +179,7 @@
 
   private static TreeLogger createLogger() {
     PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter(
-        System.err));
+        System.err, true));
     logger.setMaxDetail(TreeLogger.ERROR);
     return logger;
   }
@@ -774,17 +730,6 @@
       units.add(createMockCompilationUnit("EnumWithNonDefaultCtors", code));
     }
 
-    {
-      StringBuilder code = new StringBuilder();
-      code.append("package java.lang;\n");
-      code.append("import java.io.Serializable;\n");
-      code.append("public class Enum<E extends Enum<E>> implements Serializable {\n");
-      code.append("  protected Enum(String name, int ordinal) {\n");
-      code.append("  }\n");
-      code.append("}\n");
-      units.add(createMockCompilationUnit("java.lang.Enum", code));
-    }
-
     TreeLogger logger = createLogger();
     TypeOracle to = TypeOracleTestingUtils.buildTypeOracle(logger, units);
     SerializableTypeOracleBuilder sob = createSerializableTypeOracleBuilder(
