diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
index cfcae5d..308973d 100644
--- a/dev/core/test/com/google/gwt/dev/CompilerTest.java
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -2767,6 +2767,8 @@
         "java.lang.Throwable$HasJavaThrowable",
         "java.lang.Throwable$NativeError",
         "java.lang.Throwable$NativeTypeError",
+        "javaemul.internal.JsUtils",
+        "javaemul.internal.JsUtils$NativeNumber",
         "javaemul.internal.HashCodes",
         "javaemul.internal.NativeRegExp",
         "javaemul.internal.NativeRegExp$Match"));
diff --git a/user/super/com/google/gwt/emul/java/lang/Integer.java b/user/super/com/google/gwt/emul/java/lang/Integer.java
index 93e16dc..1e2f584 100644
--- a/user/super/com/google/gwt/emul/java/lang/Integer.java
+++ b/user/super/com/google/gwt/emul/java/lang/Integer.java
@@ -16,7 +16,6 @@
 package java.lang;
 
 import javaemul.internal.JsUtils;
-import jsinterop.annotations.JsType;
 
 /**
  * Wraps a primitive <code>int</code> as an object.
@@ -220,35 +219,16 @@
     return toUnsignedString(value, 8);
   }
 
-  private static String toUnsignedString(int value, int radix) {
-    return toRadixString(toUnsigned(value), radix);
+  static String toUnsignedString(int value, int radix) {
+    return JsUtils.uintToString(value, radix);
   }
 
-  @SuppressWarnings("unusable-by-js")
-  private static native double toUnsigned(int value) /*-{
-    // Might return a number that is larger than int32
-    return (value >>> 0);
-  }-*/;
-
   public static String toString(int value) {
     return String.valueOf(value);
   }
 
   public static String toString(int value, int radix) {
-    if (radix == 10 || radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
-      return String.valueOf(value);
-    }
-    return toRadixString(value, radix);
-  }
-
-  private static String toRadixString(double value, int radix) {
-    NativeNumber number = JsUtils.uncheckedCast(value);
-    return number.toString(radix);
-  }
-
-  @JsType(isNative = true, name = "Number", namespace = "<window>")
-  private interface NativeNumber {
-    String toString(int radix);
+    return JsUtils.intToString(value, radix);
   }
 
   public static Integer valueOf(int i) {
diff --git a/user/super/com/google/gwt/emul/java/lang/Number.java b/user/super/com/google/gwt/emul/java/lang/Number.java
index e487b9b..55ce31b 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -16,10 +16,8 @@
 package java.lang;
 
 import java.io.Serializable;
-
 import javaemul.internal.JsUtils;
 import javaemul.internal.NativeRegExp;
-
 import jsinterop.annotations.JsMethod;
 import jsinterop.annotations.JsType;
 
@@ -192,12 +190,9 @@
     if (!__isValidDouble(s)) {
       throw NumberFormatException.forInputString(s);
     }
-    return parseFloat(s);
+    return JsUtils.parseFloat(s);
   }
 
-  @JsMethod(namespace = "<window>")
-  private static native double parseFloat(String str);
-
   /**
    * @skip
    *
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
index 52e44f1..0802895 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -37,12 +37,9 @@
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.io.Serializable;
-
 import javaemul.internal.JsUtils;
 import javaemul.internal.NativeRegExp;
 
-import jsinterop.annotations.JsType;
-
 /**
  * This class represents immutable arbitrary precision decimal numbers. Each
  * {@code BigDecimal} instance is represented with a unscaled arbitrary
@@ -496,16 +493,6 @@
    * @param digits number of digits of precision to include
    * @return non-localized string representation of {@code d}
    */
-  private static String toPrecision(double value, int digits) {
-    NativeNumber number = JsUtils.uncheckedCast(value);
-    return number.toPrecision(digits);
-  }
-
-  @JsType(isNative = true, name = "Number", namespace = "<window>")
-  private interface NativeNumber {
-    String toPrecision(int digits);
-  }
-
   private static BigDecimal valueOf(double smallValue, double scale) {
     return new BigDecimal(smallValue, scale);
   }
@@ -720,7 +707,7 @@
       // math.03=Infinity or NaN
       throw new NumberFormatException("Infinite or NaN"); //$NON-NLS-1$
     }
-    initFrom(toPrecision(val, 20));
+    initFrom(JsUtils.toPrecision(val, 20));
   }
 
   /**
@@ -736,11 +723,7 @@
    *           represented within the given precision without rounding.
    */
   public BigDecimal(double val, MathContext mc) {
-    if (Double.isInfinite(val) || Double.isNaN(val)) {
-      // math.03=Infinity or NaN
-      throw new NumberFormatException("Infinite or NaN"); //$NON-NLS-1$
-    }
-    initFrom(toPrecision(val, 20));
+    this(val);
     inplaceRound(mc);
   }
 
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
index efd46f1..c8bf1e8 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
@@ -18,12 +18,11 @@
 import javaemul.internal.annotations.DoNotAutobox;
 import javaemul.internal.annotations.UncheckedCast;
 import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsType;
 
-/**
- * Provides an interface for simple JavaScript idioms that can not be expressed in Java.
- */
+/** Provides an interface for simple JavaScript idioms that can not be expressed in Java. */
 @SuppressWarnings("unusable-by-js")
-public class JsUtils {
+public final class JsUtils {
 
   @JsMethod(namespace = "<window>", name = "Date.now")
   public static native double getTime();
@@ -31,9 +30,42 @@
   @JsMethod(namespace = "<window>")
   public static native int parseInt(String s, int radix);
 
+  @JsMethod(namespace = "<window>")
+  public static native double parseFloat(String str);
+
   @JsMethod(namespace = "<window>", name = "typeof")
   public static native String typeOf(Object obj);
 
+  public static String toPrecision(double value, int precision) {
+    NativeNumber number = JsUtils.uncheckedCast(value);
+    return number.toPrecision(precision);
+  }
+
+  public static String intToString(int value, int radix) {
+    return numberToString(value, radix);
+  }
+
+  public static String uintToString(int value, int radix) {
+    return numberToString(toDoubleFromUnsignedInt(value), radix);
+  }
+
+  @JsMethod
+  public static native int toDoubleFromUnsignedInt(int value) /*-{
+    return value >>> 0;
+  }-*/;
+
+  private static String numberToString(double value, int radix) {
+    NativeNumber number = JsUtils.uncheckedCast(value);
+    return number.toString(radix);
+  }
+
+  @JsType(isNative = true, name = "Number", namespace = "<window>")
+  private interface NativeNumber {
+    String toString(int radix);
+
+    String toPrecision(int precision);
+  }
+
   public static native boolean isUndefined(Object value) /*-{
     return value === undefined;
   }-*/;
