diff --git a/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java b/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java
index ba50d5b..a6138a6 100644
--- a/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java
+++ b/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java
@@ -147,6 +147,65 @@
 
   private static final String JSO_CLASS = "com.google.gwt.core.client.JavaScriptObject";
 
+  /**
+   * Convenience method to sort class types in a consistent way. Note that the
+   * order is subject to change and is intended to generate an "aesthetically
+   * pleasing" order rather than a computationally reliable order.
+   */
+  public static void sort(JClassType[] types) {
+    Arrays.sort(types, new Comparator<JClassType>() {
+      public int compare(JClassType type1, JClassType type2) {
+        String name1 = type1.getQualifiedSourceName();
+        String name2 = type2.getQualifiedSourceName();
+        return name1.compareTo(name2);
+      }
+    });
+  }
+
+  /**
+   * Convenience method to sort constructors in a consistent way. Note that the
+   * order is subject to change and is intended to generate an "aesthetically
+   * pleasing" order rather than a computationally reliable order.
+   */
+  public static void sort(JConstructor[] ctors) {
+    Arrays.sort(ctors, new Comparator<JConstructor>() {
+      public int compare(JConstructor o1, JConstructor o2) {
+        // Nothing for now; could enhance to sort based on parameter list
+        return 0;
+      }
+    });
+  }
+
+  /**
+   * Convenience method to sort fields in a consistent way. Note that the order
+   * is subject to change and is intended to generate an "aesthetically
+   * pleasing" order rather than a computationally reliable order.
+   */
+  public static void sort(JField[] fields) {
+    Arrays.sort(fields, new Comparator<JField>() {
+      public int compare(JField f1, JField f2) {
+        String name1 = f1.getName();
+        String name2 = f2.getName();
+        return name1.compareTo(name2);
+      }
+    });
+  }
+
+  /**
+   * Convenience method to sort methods in a consistent way. Note that the order
+   * is subject to change and is intended to generate an "aesthetically
+   * pleasing" order rather than a computationally reliable order.
+   */
+  public static void sort(JMethod[] methods) {
+    Arrays.sort(methods, new Comparator<JMethod>() {
+      public int compare(JMethod m1, JMethod m2) {
+        String name1 = m1.getName();
+        String name2 = m2.getName();
+        return name1.compareTo(name2);
+      }
+    });
+  }
+
   static String[] modifierBitsToNames(int bits) {
     List<String> strings = new ArrayList<String>();
 
@@ -573,65 +632,6 @@
     ++reloadCount;
   }
 
-  /**
-   * Convenience method to sort class types in a consistent way. Note that the
-   * order is subject to change and is intended to generate an "aesthetically
-   * pleasing" order rather than a computationally reliable order.
-   */
-  public void sort(JClassType[] types) {
-    Arrays.sort(types, new Comparator<JClassType>() {
-      public int compare(JClassType type1, JClassType type2) {
-        String name1 = type1.getQualifiedSourceName();
-        String name2 = type2.getQualifiedSourceName();
-        return name1.compareTo(name2);
-      }
-    });
-  }
-
-  /**
-   * Convenience method to sort constructors in a consistent way. Note that the
-   * order is subject to change and is intended to generate an "aesthetically
-   * pleasing" order rather than a computationally reliable order.
-   */
-  public void sort(JConstructor[] ctors) {
-    Arrays.sort(ctors, new Comparator<JConstructor>() {
-      public int compare(JConstructor o1, JConstructor o2) {
-        // Nothing for now; could enhance to sort based on parameter list
-        return 0;
-      }
-    });
-  }
-
-  /**
-   * Convenience method to sort fields in a consistent way. Note that the order
-   * is subject to change and is intended to generate an "aesthetically
-   * pleasing" order rather than a computationally reliable order.
-   */
-  public void sort(JField[] fields) {
-    Arrays.sort(fields, new Comparator<JField>() {
-      public int compare(JField f1, JField f2) {
-        String name1 = f1.getName();
-        String name2 = f2.getName();
-        return name1.compareTo(name2);
-      }
-    });
-  }
-
-  /**
-   * Convenience method to sort methods in a consistent way. Note that the order
-   * is subject to change and is intended to generate an "aesthetically
-   * pleasing" order rather than a computationally reliable order.
-   */
-  public void sort(JMethod[] methods) {
-    Arrays.sort(methods, new Comparator<JMethod>() {
-      public int compare(JMethod m1, JMethod m2) {
-        String name1 = m1.getName();
-        String name2 = m2.getName();
-        return name1.compareTo(name2);
-      }
-    });
-  }
-
   void addNewType(JRealClassType newType) {
     String fqcn = newType.getQualifiedSourceName();
     allTypes.put(fqcn, newType);
diff --git a/dev/core/test/com/google/gwt/core/ext/typeinfo/JDelegatingClassTypeTestBase.java b/dev/core/test/com/google/gwt/core/ext/typeinfo/JDelegatingClassTypeTestBase.java
index 88aec30..b6148cd 100644
--- a/dev/core/test/com/google/gwt/core/ext/typeinfo/JDelegatingClassTypeTestBase.java
+++ b/dev/core/test/com/google/gwt/core/ext/typeinfo/JDelegatingClassTypeTestBase.java
@@ -98,10 +98,10 @@
     assertArraysEqual(expected, actual);
   }
 
-  protected static void validateEquals(TypeOracle oracle,
-      JClassType[] expectedTypes, JClassType actualTypes[]) {
-    oracle.sort(expectedTypes);
-    oracle.sort(actualTypes);
+  protected static void validateEquals(JClassType[] expectedTypes,
+      JClassType actualTypes[]) {
+    TypeOracle.sort(expectedTypes);
+    TypeOracle.sort(actualTypes);
 
     assertArraysEqual(expectedTypes, actualTypes);
   }
diff --git a/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java b/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java
index 43eb420..8d8ff73 100644
--- a/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java
+++ b/dev/core/test/com/google/gwt/core/ext/typeinfo/JParameterizedTypeTest.java
@@ -213,7 +213,7 @@
         oracle.getType(MyIntegerList.class.getName()),
         parameterizedMyCustomList};
 
-    validateEquals(oracle, expected, actualSubtypes);
+    validateEquals(expected, actualSubtypes);
   }
 
   /**
diff --git a/dev/core/test/com/google/gwt/core/ext/typeinfo/JRawTypeTest.java b/dev/core/test/com/google/gwt/core/ext/typeinfo/JRawTypeTest.java
index e8027a0..1986e24 100644
--- a/dev/core/test/com/google/gwt/core/ext/typeinfo/JRawTypeTest.java
+++ b/dev/core/test/com/google/gwt/core/ext/typeinfo/JRawTypeTest.java
@@ -75,7 +75,7 @@
         oracle.getType(MyIntegerList.class.getName())};
     JClassType[] actualSubtypes = rawTestType.getSubtypes();
 
-    validateEquals(oracle, expectedTypes, actualSubtypes);
+    validateEquals(expectedTypes, actualSubtypes);
   }
 
   @Override
