diff --git a/user/test-super/com/google/gwt/dev/jjs/super/com/google/gwt/dev/jjs/test/Java8Test.java b/user/test-super/com/google/gwt/dev/jjs/super/com/google/gwt/dev/jjs/test/Java8Test.java
index 7962573..782a42c 100644
--- a/user/test-super/com/google/gwt/dev/jjs/super/com/google/gwt/dev/jjs/test/Java8Test.java
+++ b/user/test-super/com/google/gwt/dev/jjs/super/com/google/gwt/dev/jjs/test/Java8Test.java
@@ -1604,7 +1604,22 @@
   }
 
   @JsFunction
-  interface JsFunctionInterface {
+  interface MyJsFunctionInterface {
+    int foo(int a);
+  }
+
+  public void testJsFunction_lambda() {
+    MyJsFunctionInterface jsFunctionInterface = a -> a + 2;
+    assertEquals(12, callAsFunction(jsFunctionInterface, 10));
+    assertEquals(12, jsFunctionInterface.foo(10));
+  }
+
+  private static native int callAsFunction(Object fn, int arg) /*-{
+    return fn(arg);
+  }-*/;
+
+  @JsFunction
+  interface MyJsFunctionInterfaceWithOverlay {
     Double m();
     @JsOverlay
     default Double callM() {
@@ -1612,11 +1627,12 @@
     }
   }
 
-  private static native JsFunctionInterface createNative() /*-{
+  private static native MyJsFunctionInterfaceWithOverlay createNative() /*-{
     return function () { return 5; };
   }-*/;
+
   public void testJsFunction_withOverlay() {
-    JsFunctionInterface f = new JsFunctionInterface() {
+    MyJsFunctionInterfaceWithOverlay f = new MyJsFunctionInterfaceWithOverlay() {
       @Override
       public Double m() {
         return new Double(2.0);
diff --git a/user/test/com/google/gwt/core/CoreJsInteropSuite.java b/user/test/com/google/gwt/core/CoreJsInteropSuite.java
index 211aecb..98bff5c 100644
--- a/user/test/com/google/gwt/core/CoreJsInteropSuite.java
+++ b/user/test/com/google/gwt/core/CoreJsInteropSuite.java
@@ -23,7 +23,6 @@
 import com.google.gwt.core.interop.JsTypeArrayTest;
 import com.google.gwt.core.interop.JsTypeBridgeTest;
 import com.google.gwt.core.interop.JsTypeObjectMethodsTest;
-import com.google.gwt.core.interop.JsTypeSpecialTypesTest;
 import com.google.gwt.core.interop.JsTypeTest;
 import com.google.gwt.core.interop.JsTypeVarargsTest;
 import com.google.gwt.core.interop.NativeJsTypeTest;
@@ -42,7 +41,6 @@
     suite.addTestSuite(JsExportOptimizationTest.class);
     suite.addTestSuite(JsTypeTest.class);
     suite.addTestSuite(JsTypeBridgeTest.class);
-    suite.addTestSuite(JsTypeSpecialTypesTest.class);
     suite.addTestSuite(JsTypeObjectMethodsTest.class);
     suite.addTestSuite(JsPropertyTest.class);
     suite.addTestSuite(JsMethodTest.class);
diff --git a/user/test/com/google/gwt/core/interop/JsFunctionTest.java b/user/test/com/google/gwt/core/interop/JsFunctionTest.java
index d7b2cbb..8c56e97 100644
--- a/user/test/com/google/gwt/core/interop/JsFunctionTest.java
+++ b/user/test/com/google/gwt/core/interop/JsFunctionTest.java
@@ -24,6 +24,7 @@
 
 /**
  * Tests JsFunction functionality.
+ * Note that JsOverlay and lambda's are tested in Java8Test.
  */
 @SuppressWarnings("cast")
 public class JsFunctionTest extends GWTTestCase {
@@ -249,7 +250,6 @@
   }
 
   public void testGetClass() {
-
     MyJsFunctionInterface jsfunctionImplementation =
         new MyJsFunctionInterface() {
           @Override
@@ -264,7 +264,6 @@
   }
 
   public void testInstanceField() {
-
     MyJsFunctionInterface jsfunctionImplementation =
         new MyJsFunctionInterface() {
           String hello = new Object().getClass().getName();
@@ -276,26 +275,6 @@
     assertEquals(Object.class.getName().length() + 4, jsfunctionImplementation.foo(4));
   }
 
-  // uncomment when Java8 is supported.
-//  public void testJsFunctionLambda_JS() {
-//    MyJsFunctionInterface jsFunctionInterface = a -> { return a + 2; };
-//    assertEquals(12, callAsFunction(jsFunctionInterface, 10));
-//    assertEquals(12, callAsCallBackFunction(jsFunctionInterface, 10));
-//  }
-//
-//  public void testJsFunctionLambda_Java() {
-//    MyJsFunctionInterface jsFunctionInterface = a -> { return a + 2; };
-//    assertEquals(12, jsFunctionInterface.foo(10));
-//  }
-//
-//  public void testJsFunctionDefaultMethod() {
-//    MyJsFunctionSubInterfaceWithDefaultMethod impl =
-//        new MyJsFunctionSubInterfaceWithDefaultMethod() {
-//        };
-//    assertEquals(10, impl.foo(10));
-//    assertEquals(10, callAsFunction(impl, 10));
-//  }
-
   private static native Object callAsFunction(Object fn) /*-{
     return fn();
   }-*/;
diff --git a/user/test/com/google/gwt/core/interop/JsTypeArrayTest.java b/user/test/com/google/gwt/core/interop/JsTypeArrayTest.java
index 7ac5fec..b1e50d4 100644
--- a/user/test/com/google/gwt/core/interop/JsTypeArrayTest.java
+++ b/user/test/com/google/gwt/core/interop/JsTypeArrayTest.java
@@ -97,7 +97,6 @@
     public SimpleJsTypeAsAField[] arrayField;
   }
 
-  // TODO(rluble): Needs fixes in ImlementCastsAndTypeChecks, ArrayNormalizer and maybe type oracle.
   public void testJsTypeArray_asAField() {
     SimpleJsTypeAsAFieldHolder holder = new SimpleJsTypeAsAFieldHolder();
     fillArrayField(holder);
@@ -202,6 +201,17 @@
     assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[][][]);
   }
 
+  @JsType(isNative = true)
+  private static class UnreferencedNativeType { }
+
+  private static native Object createArray() /*-{
+    return [];
+  }-*/;
+
+  public void testJsTypeArray_unreferencedNativeArrayInstanceOf() {
+    assertTrue(createArray() instanceof UnreferencedNativeType[]);
+  }
+
   @JsFunction
   interface SomeFunction {
     int m(int i);
diff --git a/user/test/com/google/gwt/core/interop/JsTypeSpecialTypesTest.java b/user/test/com/google/gwt/core/interop/JsTypeSpecialTypesTest.java
deleted file mode 100644
index afea9ee..0000000
--- a/user/test/com/google/gwt/core/interop/JsTypeSpecialTypesTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2015 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 com.google.gwt.core.interop;
-
-import com.google.gwt.junit.client.GWTTestCase;
-
-import jsinterop.annotations.JsFunction;
-import jsinterop.annotations.JsPackage;
-import jsinterop.annotations.JsType;
-
-/**
- * Tests special JsType functionality.
- */
-@SuppressWarnings("cast")
-public class JsTypeSpecialTypesTest extends GWTTestCase {
-
-  @Override
-  public String getModuleName() {
-    return "com.google.gwt.core.Interop";
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Array")
-  static class NativeArray {
-  }
-
-  public void testNativeArray() {
-    Object object = new Object[10];
-
-    assertNotNull((NativeArray) object);
-    assertTrue(object instanceof NativeArray);
-
-    Object nativeArray = new NativeArray();
-    assertNotNull((NativeArray[]) nativeArray);
-    assertTrue(nativeArray instanceof NativeArray[]);
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Function")
-  static class NativeFunction {
-  }
-
-  @JsFunction
-  interface  SomeFunctionalInterface {
-    void m();
-  }
-
-  public void testNativeFunction() {
-    Object object = new SomeFunctionalInterface() {
-          @Override
-          public void m() {
-          }
-        };
-
-    assertNotNull((NativeFunction) object);
-    assertTrue(object instanceof NativeFunction);
-
-    SomeFunctionalInterface nativeFunction = (SomeFunctionalInterface) new NativeFunction();
-    assertTrue(nativeFunction instanceof SomeFunctionalInterface);
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Number")
-  static class NativeNumber {
-    public NativeNumber(double number) { }
-    public native NativeNumber valueOf();
-  }
-
-  public void testNativeNumber() {
-    Object object = new Double(1);
-
-    assertNotNull((NativeNumber) object);
-    assertTrue(object instanceof NativeNumber);
-
-    // new NativeString() returns a boxed JS number. Java Double object are only interchangeable
-    // with unboxed JS numbers.
-    Object nativeNumber = new NativeNumber(10.0).valueOf();
-    assertNotNull((Double) nativeNumber);
-    assertTrue(nativeNumber instanceof Double);
-    assertEquals(10.0, (Double) nativeNumber);
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "String")
-  static class NativeString {
-    public NativeString(String someString) { }
-    public native NativeString valueOf();
-  }
-
-  public void testNativeString() {
-    Object object = "Hello";
-
-    assertNotNull((NativeString) object);
-    assertTrue(object instanceof NativeString);
-
-    // new NativeString() returns a boxed JS string. Java String objects are only interchangeable
-    // with unboxed JS strings.
-    Object nativeString = new NativeString("Hello").valueOf();
-    assertNotNull((String) nativeString);
-    assertTrue(nativeString instanceof String);
-    assertEquals("Hello", nativeString);
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
-  static class NativeObject {
-  }
-
-  public void testNativeObject() {
-    Object object = new Object();
-
-    assertNotNull((NativeObject) object);
-    assertTrue(object instanceof NativeObject);
-
-    Object nativeObject = new NativeObject();
-    assertNotNull((Object) nativeObject);
-    assertTrue(nativeObject instanceof Object);
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "*")
-  interface Star {
-  }
-
-  public void testStar() {
-    Object object = new Object();
-
-    assertNotNull((Star) object);
-
-    object = Double.valueOf(3.0);
-    assertNotNull((Star) object);
-  }
-
-  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "?")
-  interface Wildcard {
-  }
-
-  public void testWildcard() {
-    Object object = new Object();
-
-    assertNotNull((Wildcard) object);
-
-    object = Double.valueOf(3.0);
-    assertNotNull((Wildcard) object);
-  }
-}
diff --git a/user/test/com/google/gwt/core/interop/JsTypeTest.java b/user/test/com/google/gwt/core/interop/JsTypeTest.java
index 5b7fba7..dc1ea1c 100644
--- a/user/test/com/google/gwt/core/interop/JsTypeTest.java
+++ b/user/test/com/google/gwt/core/interop/JsTypeTest.java
@@ -515,6 +515,32 @@
     assertEquals("bar", callFunction(instance, "bar", null));
   }
 
+  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "*")
+  interface Star {
+  }
+
+  public void testStar() {
+    Object object = new Object();
+
+    assertNotNull((Star) object);
+
+    object = Double.valueOf(3.0);
+    assertNotNull((Star) object);
+  }
+
+  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "?")
+  interface Wildcard {
+  }
+
+  public void testWildcard() {
+    Object object = new Object();
+
+    assertNotNull((Wildcard) object);
+
+    object = Double.valueOf(3.0);
+    assertNotNull((Wildcard) object);
+  }
+
   static class ClassWithJsMethod {
     @JsMethod(name = "name")
     public String className() {
diff --git a/user/test/com/google/gwt/core/interop/MyJsFunctionSubInterfaceWithDefaultMethod.java b/user/test/com/google/gwt/core/interop/MyJsFunctionSubInterfaceWithDefaultMethod.java
deleted file mode 100644
index ce0b410..0000000
--- a/user/test/com/google/gwt/core/interop/MyJsFunctionSubInterfaceWithDefaultMethod.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2015 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 com.google.gwt.core.interop;
-
-/**
- * An interface that extends JsFunction interface {@code MyJsFunctionInterface} with default method.
- */
-public interface MyJsFunctionSubInterfaceWithDefaultMethod extends MyJsFunctionInterface {
-
-  // uncomment when Java8 is supported.
-//  @Override
-//  default int foo(int a) {
-//    return a;
-//  }
-}
diff --git a/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java b/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java
index 4cf5378..b36456e 100644
--- a/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java
+++ b/user/test/com/google/gwt/core/interop/NativeJsTypeTest.java
@@ -18,7 +18,6 @@
 import static jsinterop.annotations.JsPackage.GLOBAL;
 
 import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.interop.JsTypeSpecialTypesTest.SomeFunctionalInterface;
 import com.google.gwt.junit.client.GWTTestCase;
 
 import javaemul.internal.annotations.DoNotInline;
@@ -273,7 +272,7 @@
     Object aJsFunction = new SomeFunction();
     // True cases.
     assertTrue(aJsFunction instanceof NativeFunction);
-    assertTrue(aJsFunction instanceof SomeFunctionalInterface);
+    assertTrue(aJsFunction instanceof SomeFunctionInterface);
     assertTrue(aJsFunction instanceof NativeObject);
     // False cases.
     assertFalse(aJsFunction instanceof NativeArray);
@@ -283,7 +282,7 @@
     Object anotherFunction = createFunction();
     // True cases.
     assertTrue(anotherFunction instanceof NativeFunction);
-    assertTrue(anotherFunction instanceof SomeFunctionalInterface);
+    assertTrue(anotherFunction instanceof SomeFunctionInterface);
     assertTrue(anotherFunction instanceof NativeObject);
     // False cases.
     assertFalse(anotherFunction instanceof NativeArray);
@@ -354,6 +353,15 @@
     assertFalse(aBoxedNumber instanceof NativeFunction);
     assertFalse(aBoxedNumber instanceof NativeString);
 
+    Object anObject = new Object();
+    // True cases.
+    assertTrue(anObject instanceof NativeObject);
+    // False cases.
+    assertFalse(anObject instanceof NativeNumber);
+    assertFalse(anObject instanceof NativeArray);
+    assertFalse(anObject instanceof NativeFunction);
+    assertFalse(anObject instanceof NativeString);
+
     Object nullObject = null;
 
     assertFalse(nullObject instanceof NativeObject);
@@ -373,17 +381,6 @@
   private static native Object getUndefined() /*-{
   }-*/;
 
-  @JsType(isNative = true)
-  private static class UnreferencedNativeType { }
-
-  private static native Object createArray() /*-{
-    return [];
-  }-*/;
-
-  public void testUnreferencedNativeArrayInstanceOf() {
-    assertTrue(createArray() instanceof UnreferencedNativeType[]);
-  }
-
   @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
   interface NativeInterface {
     void add(String element);
