diff --git a/user/super/com/google/gwt/emul/java/io/Serializable.java b/user/super/com/google/gwt/emul/java/io/Serializable.java
index 9458df5..3d3a91d 100644
--- a/user/super/com/google/gwt/emul/java/io/Serializable.java
+++ b/user/super/com/google/gwt/emul/java/io/Serializable.java
@@ -15,8 +15,8 @@
  */
 package java.io;
 
+import javaemul.internal.ArrayHelper;
 import javaemul.internal.JsUtils;
-import javaemul.internal.NativeArray;
 import jsinterop.annotations.JsMethod;
 
 /**
@@ -38,7 +38,7 @@
         || type.equals("string")
         || instance.getTypeMarker()
         // Arrays are implicitly instances of Serializable (JLS 10.7).
-        || NativeArray.isArray(instance);
+        || ArrayHelper.isArray(instance);
   }
   // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/lang/Cloneable.java b/user/super/com/google/gwt/emul/java/lang/Cloneable.java
index 907f569..21db90a 100644
--- a/user/super/com/google/gwt/emul/java/lang/Cloneable.java
+++ b/user/super/com/google/gwt/emul/java/lang/Cloneable.java
@@ -15,7 +15,7 @@
  */
 package java.lang;
 
-import javaemul.internal.NativeArray;
+import javaemul.internal.ArrayHelper;
 import jsinterop.annotations.JsMethod;
 
 /**
@@ -32,7 +32,7 @@
 
     return instance.getTypeMarker()
         // Arrays are implicitly instances of Cloneable (JLS 10.7).
-        || NativeArray.isArray(instance);
+        || ArrayHelper.isArray(instance);
   }
   // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java
index 3ddb92a..f0fa2fa 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -40,8 +40,8 @@
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 import javaemul.internal.ArrayHelper;
+import javaemul.internal.ArrayHelper.CompareFunction;
 import javaemul.internal.JsUtils;
-import javaemul.internal.NativeArray.CompareFunction;
 import jsinterop.annotations.JsFunction;
 
 /**
@@ -1241,7 +1241,7 @@
   }
 
   public static void sort(double[] array) {
-    ArrayHelper.asNativeArray(array).sort(getDoubleComparator());
+    ArrayHelper.sort(array, getDoubleComparator());
   }
 
   public static void sort(double[] array, int fromIndex, int toIndex) {
@@ -1250,7 +1250,7 @@
   }
 
   public static void sort(float[] array) {
-    ArrayHelper.asNativeArray(array).sort(getDoubleComparator());
+    ArrayHelper.sort(array, getDoubleComparator());
   }
 
   public static void sort(float[] array, int fromIndex, int toIndex) {
@@ -1268,7 +1268,7 @@
   }
 
   public static void sort(long[] array) {
-    ArrayHelper.asNativeArray(array).sort(getLongComparator());
+    ArrayHelper.sort(array, getLongComparator());
   }
 
   public static void sort(long[] array, int fromIndex, int toIndex) {
@@ -1700,7 +1700,7 @@
    */
   private static void nativeSort(Object array, int fromIndex, int toIndex, CompareFunction fn) {
     Object temp = ArrayHelper.unsafeClone(array, fromIndex, toIndex);
-    ArrayHelper.asNativeArray(temp).sort(fn);
+    ArrayHelper.sort(temp, fn);
     ArrayHelper.copy(temp, 0, array, fromIndex, toIndex - fromIndex);
   }
 
@@ -1708,7 +1708,7 @@
    * Sort an entire array of number primitives of integral type.
    */
   private static void nativeIntegerSort(Object array) {
-    ArrayHelper.asNativeArray(array).sort(getIntComparator());
+    ArrayHelper.sort(array, getIntComparator());
   }
 
   /**
diff --git a/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java b/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java
index ab96835..4b9a251 100644
--- a/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java
+++ b/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java
@@ -21,7 +21,6 @@
 import java.util.Map.Entry;
 import javaemul.internal.ArrayHelper;
 import javaemul.internal.JsUtils;
-import javaemul.internal.NativeArray;
 
 /**
  * A simple wrapper around JavaScriptObject to provide {@link java.util.Map}-like semantics for any
@@ -148,7 +147,7 @@
   }
 
   private Entry<K, V>[] newEntryChain() {
-    return JsUtils.uncheckedCast(new NativeArray());
+    return JsUtils.uncheckedCast(new Object[0]);
   }
 
   /**
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java b/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
index c388935..ed3ba73 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
@@ -15,14 +15,13 @@
  */
 package javaemul.internal;
 
-import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsFunction;
+import jsinterop.annotations.JsMethod;
 import jsinterop.annotations.JsProperty;
 import jsinterop.annotations.JsType;
 
-/**
- * Provides utilities to perform operations on Arrays.
- */
-public class ArrayHelper {
+/** Provides utilities to perform operations on Arrays. */
+public final class ArrayHelper {
 
   public static final int ARRAY_PROCESS_BATCH_SIZE = 10000;
 
@@ -43,6 +42,9 @@
     return ArrayStamper.stampJavaTypeInfo(new NativeArray(length), array);
   }
 
+  @JsMethod(name = "Array.isArray", namespace = "<window>")
+  public static native boolean isArray(Object o);
+
   public static int getLength(Object array) {
     return asNativeArray(array).length;
   }
@@ -85,14 +87,14 @@
       int batchEnd = Math.min(batchStart + ARRAY_PROCESS_BATCH_SIZE, end);
       len = batchEnd - batchStart;
       Object[] spliceArgs = unsafeClone(src, batchStart, batchEnd);
-      asNativeArray(spliceArgs).splice(0, 0, destOfs, overwrite ? len : 0);
+      asNativeArray(spliceArgs).splice(0, 0, (double) destOfs, (double) (overwrite ? len : 0));
       getSpliceFunction().apply(destArray, spliceArgs);
       batchStart = batchEnd;
       destOfs += len;
     }
   }
 
-  @JsType(isNative = true, name = "Function", namespace = JsPackage.GLOBAL)
+  @JsType(isNative = true, name = "Function", namespace = "<window>")
   private static class NativeFunction {
     public native String apply(Object thisContext, Object[] argsArray);
   }
@@ -100,8 +102,35 @@
   @JsProperty(name = "Array.prototype.splice", namespace = "<window>")
   private static native NativeFunction getSpliceFunction();
 
-  public static NativeArray asNativeArray(Object array) {
+  /** Compare function for sort. */
+  @JsFunction
+  public interface CompareFunction {
+    double compare(Object d1, Object d2);
+  }
+
+  public static void sort(Object array, CompareFunction fn) {
+    asNativeArray(array).sort(fn);
+  }
+
+  private static NativeArray asNativeArray(Object array) {
     return JsUtils.uncheckedCast(array);
   }
+
+  @JsType(isNative = true, name = "Array", namespace = "<window>")
+  private static class NativeArray {
+    int length;
+
+    NativeArray(int length) {}
+
+    native Object concat(Object arrayToAdd);
+
+    native Object[] slice(int fromIndex, int toIndex);
+
+    native void splice(int index, int deleteCount, Object... value);
+
+    native <T> void sort(CompareFunction compareFunction);
+  }
+
+  private ArrayHelper() {}
 }
 
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/NativeArray.java b/user/super/com/google/gwt/emul/javaemul/internal/NativeArray.java
deleted file mode 100644
index 792ab3c..0000000
--- a/user/super/com/google/gwt/emul/javaemul/internal/NativeArray.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 javaemul.internal;
-
-import javaemul.internal.annotations.DoNotAutobox;
-import jsinterop.annotations.JsFunction;
-import jsinterop.annotations.JsType;
-
-/**
- * Simple class to work with native array API.
- */
-@JsType(isNative = true, name = "Array", namespace = "<window>")
-public class NativeArray {
-  /**
-   * Compare function for sort.
-   */
-  @JsFunction
-  public interface CompareFunction {
-    double compare(Object d1, Object d2);
-  }
-
-  public int length;
-  public NativeArray() { }
-  public NativeArray(int length) { }
-  public native Object concat(Object arrayToAdd);
-  public native Object[] slice(int fromIndex, int toIndex);
-  public native void splice(int index, int deleteCount, @DoNotAutobox Object... value);
-  public native <T> void sort(CompareFunction compareFunction);
-
-  public static native boolean isArray(Object o);
-}
