diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
index 1e56f38..b8b9e8f 100644
--- a/dev/core/test/com/google/gwt/dev/CompilerTest.java
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -2745,6 +2745,8 @@
         "java.lang.CharSequence",
         "java.lang.Comparable",
         "java.lang.Double",
+        "java.lang.HasCharSequenceTypeMarker",
+        "java.lang.HasComparableTypeMarker",
         "java.lang.Number",
         "java.lang.String",
         "java.lang.String$NativeFunction",
diff --git a/user/super/com/google/gwt/emul/java/lang/CharSequence.java b/user/super/com/google/gwt/emul/java/lang/CharSequence.java
index 302b0c3..dc76d00 100644
--- a/user/super/com/google/gwt/emul/java/lang/CharSequence.java
+++ b/user/super/com/google/gwt/emul/java/lang/CharSequence.java
@@ -62,12 +62,12 @@
 
   // CHECKSTYLE_OFF: Utility methods.
   @JsMethod
-  static boolean $isInstance(Object instance) {
+  static boolean $isInstance(HasCharSequenceTypeMarker instance) {
     if (JsUtils.typeOf(instance).equals("string")) {
       return true;
     }
 
-    return instance != null && JsUtils.hasCharSequenceTypeMarker(instance);
+    return instance != null && instance.getTypeMarker() == true;
   }
   // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/lang/Comparable.java b/user/super/com/google/gwt/emul/java/lang/Comparable.java
index 8e92784..73191d0 100644
--- a/user/super/com/google/gwt/emul/java/lang/Comparable.java
+++ b/user/super/com/google/gwt/emul/java/lang/Comparable.java
@@ -31,13 +31,13 @@
 
   // CHECKSTYLE_OFF: Utility methods.
   @JsMethod
-  static boolean $isInstance(Object instance) {
+  static boolean $isInstance(HasComparableTypeMarker instance) {
     String type = JsUtils.typeOf(instance);
     if (type.equals("boolean") || type.equals("number") || type.equals("string")) {
       return true;
     }
 
-    return instance != null && JsUtils.hasComparableTypeMarker(instance);
+    return instance != null && instance.getTypeMarker() == true;
   }
   // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/lang/HasCharSequenceTypeMarker.java b/user/super/com/google/gwt/emul/java/lang/HasCharSequenceTypeMarker.java
new file mode 100644
index 0000000..ed2855c
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/lang/HasCharSequenceTypeMarker.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package java.lang;
+
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
+
+@JsType(isNative = true, name = "*", namespace = JsPackage.GLOBAL)
+interface HasCharSequenceTypeMarker {
+  @JsProperty(name = "$implements__java_lang_CharSequence")
+  boolean getTypeMarker();
+}
diff --git a/user/super/com/google/gwt/emul/java/lang/HasComparableTypeMarker.java b/user/super/com/google/gwt/emul/java/lang/HasComparableTypeMarker.java
new file mode 100644
index 0000000..d060b49
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/lang/HasComparableTypeMarker.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package java.lang;
+
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
+
+@JsType(isNative = true, name = "*", namespace = JsPackage.GLOBAL)
+interface HasComparableTypeMarker {
+  @JsProperty(name = "$implements__java_lang_Comparable")
+  boolean getTypeMarker();
+}
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 4c927f1..0fe193a 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -371,7 +371,11 @@
 
   @Override
   public int compareTo(String other) {
-    return JsUtils.compare(checkNotNull(this), checkNotNull(other));
+    // Trick compiler into thinking that these are double so what we could do arithmetic comparison
+    // which is supported on underlying JavaScript strings.
+    double a = JsUtils.unsafeCastToDouble(checkNotNull(this));
+    double b = JsUtils.unsafeCastToDouble(checkNotNull(other));
+    return a == b ? 0 : (a < b ? -1 : 1);
   }
 
   public int compareToIgnoreCase(String other) {
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractHashMap.java b/user/super/com/google/gwt/emul/java/util/AbstractHashMap.java
index 1d96828..d3ffe81 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractHashMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractHashMap.java
@@ -173,7 +173,7 @@
   @Override
   public boolean containsKey(Object key) {
     return key instanceof String
-        ? hasStringValue(JsUtils.unsafeCastToString(key)) : hasHashValue(key);
+        ? hasStringValue(JsUtils.uncheckedCast(key)) : hasHashValue(key);
   }
 
   @Override
@@ -199,21 +199,21 @@
   @Override
   public V get(Object key) {
     return key instanceof String
-        ? getStringValue(JsUtils.unsafeCastToString(key)) : getHashValue(key);
+        ? getStringValue(JsUtils.uncheckedCast(key)) : getHashValue(key);
   }
 
   @SpecializeMethod(params = {String.class, Object.class}, target = "putStringValue")
   @Override
   public V put(K key, V value) {
     return key instanceof String
-        ? putStringValue(JsUtils.unsafeCastToString(key), value) : putHashValue(key, value);
+        ? putStringValue(JsUtils.uncheckedCast(key), value) : putHashValue(key, value);
   }
 
   @SpecializeMethod(params = {String.class}, target = "removeStringValue")
   @Override
   public V remove(Object key) {
     return key instanceof String
-        ? removeStringValue(JsUtils.unsafeCastToString(key)) : removeHashValue(key);
+        ? removeStringValue(JsUtils.uncheckedCast(key)) : removeHashValue(key);
   }
 
   @Override
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/HashCodes.java b/user/super/com/google/gwt/emul/javaemul/internal/HashCodes.java
index 4abddc5..0a50eac 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/HashCodes.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/HashCodes.java
@@ -22,7 +22,7 @@
   public static int getIdentityHashCode(Object o) {
     switch (JsUtils.typeOf(o)) {
       case "string":
-        return getStringHashCode(JsUtils.unsafeCastToString(o));
+        return getStringHashCode(JsUtils.uncheckedCast(o));
       case "number":
         return Double.hashCode(JsUtils.unsafeCastToDouble(o));
       case "boolean":
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 b2f128c..21a1d5a 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
@@ -16,6 +16,8 @@
 package javaemul.internal;
 
 import javaemul.internal.annotations.UncheckedCast;
+import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsProperty;
 
 /**
  * Provides an interface for simple JavaScript idioms that can not be expressed in Java.
@@ -26,25 +28,25 @@
     return a == b ? 0 : (a < b ? -1 : 1);
   }-*/;
 
-  public static native boolean isFinite(double d) /*-{
-    return isFinite(d);
-  }-*/;
+  @JsMethod(namespace = "<window>")
+  public static native boolean isFinite(double d);
 
-  public static native boolean isNaN(double d) /*-{
-    return isNaN(d);
-  }-*/;
+  @JsMethod(namespace = "<window>")
+  public static native boolean isNaN(double d);
 
-  public static native int parseInt(String s, int radix) /*-{
-    return parseInt(s, radix);
-  }-*/;
+  @JsMethod(namespace = "<window>")
+  public static native int parseInt(String s, int radix);
 
-  public static native boolean isUndefined(Object value) /*-{
-    return value === undefined;
-  }-*/;
+  @JsProperty(namespace = "<window>")
+  public static native Object getUndefined();
 
-  public static native String unsafeCastToString(Object string) /*-{
-   return string;
-  }-*/;
+  public static boolean isUndefined(Object value) {
+    return isSame(value, getUndefined());
+  }
+
+  public static native boolean isSame(Object x, Object y) /*-{
+    return x === y;
+   }-*/;
 
   public static native double unsafeCastToDouble(Object number) /*-{
    return number;
@@ -82,13 +84,5 @@
   public static native String typeOf(Object o) /*-{
     return typeof o;
   }-*/;
-
-  public static native boolean hasComparableTypeMarker(Object o) /*-{
-    return o.$implements__java_lang_Comparable;
-  }-*/;
-
-  public static native boolean hasCharSequenceTypeMarker(Object o) /*-{
-    return o.$implements__java_lang_CharSequence;
-  }-*/;
 }
 
