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 cc08e51..a9dd2a4 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -41,8 +41,7 @@
 import java.util.stream.StreamSupport;
 
 import javaemul.internal.ArrayHelper;
-import javaemul.internal.DoubleCompareHolder;
-import javaemul.internal.LongCompareHolder;
+import jsinterop.annotations.JsFunction;
 
 /**
  * Utility methods related to native arrays.
@@ -1280,21 +1279,21 @@
   }
 
   public static void sort(double[] array) {
-    nativeSort(array, DoubleCompareHolder.getDoubleComparator());
+    nativeSort(array, getDoubleComparator());
   }
 
   public static void sort(double[] array, int fromIndex, int toIndex) {
     checkCriticalArrayBounds(fromIndex, toIndex, array.length);
-    nativeSort(array, fromIndex, toIndex, DoubleCompareHolder.getDoubleComparator());
+    nativeSort(array, fromIndex, toIndex, getDoubleComparator());
   }
 
   public static void sort(float[] array) {
-    nativeSort(array, DoubleCompareHolder.getDoubleComparator());
+    nativeSort(array, getDoubleComparator());
   }
 
   public static void sort(float[] array, int fromIndex, int toIndex) {
     checkCriticalArrayBounds(fromIndex, toIndex, array.length);
-    nativeSort(array, fromIndex, toIndex, DoubleCompareHolder.getDoubleComparator());
+    nativeSort(array, fromIndex, toIndex, getDoubleComparator());
   }
 
   public static void sort(int[] array) {
@@ -1307,12 +1306,12 @@
   }
 
   public static void sort(long[] array) {
-    nativeSort(array, LongCompareHolder.getLongComparator());
+    nativeSort(array, getLongComparator());
   }
 
   public static void sort(long[] array, int fromIndex, int toIndex) {
     checkCriticalArrayBounds(fromIndex, toIndex, array.length);
-    nativeSort(array, fromIndex, toIndex, LongCompareHolder.getLongComparator());
+    nativeSort(array, fromIndex, toIndex, getLongComparator());
   }
 
   public static void sort(Object[] array) {
@@ -1753,19 +1752,42 @@
   /**
    * Sort an entire array of number primitives of integral type.
    */
-  private static native void nativeIntegerSort(Object array) /*-{
-    array.sort(function(a, b) {
-      return a - b;
-    });
-  }-*/;
+  private static void nativeIntegerSort(Object array) {
+    nativeSort(array, getIntComparator());
+  }
 
   /**
    * Sort a subset of an array of primitives of integral type.
    */
   private static void nativeIntegerSort(Object array, int fromIndex, int toIndex) {
-    Object temp = ArrayHelper.unsafeClone(array, fromIndex, toIndex);
-    nativeIntegerSort(temp);
-    ArrayHelper.copy(temp, 0, array, fromIndex, toIndex - fromIndex);
+    nativeSort(array, fromIndex, toIndex, getIntComparator());
+  }
+
+  @JsFunction
+  private interface CompareDoubleFunction {
+    int compare(double d1, double d2);
+  }
+
+  private static CompareDoubleFunction getDoubleComparator() {
+    return Double::compare;
+  }
+
+  @JsFunction
+  private interface CompareLongFunction {
+    int compare(long d1, long d2);
+  }
+
+  private static CompareLongFunction getLongComparator() {
+    return Long::compare;
+  }
+
+  @JsFunction
+  private interface CompareIntFunction {
+    int compare(int d1, int d2);
+  }
+
+  private static CompareIntFunction getIntComparator() {
+    return (a, b) -> a - b;
   }
 
   private Arrays() { }
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/DoubleCompareHolder.java b/user/super/com/google/gwt/emul/javaemul/internal/DoubleCompareHolder.java
deleted file mode 100644
index 1fe9d58..0000000
--- a/user/super/com/google/gwt/emul/javaemul/internal/DoubleCompareHolder.java
+++ /dev/null
@@ -1,27 +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;
-
-/**
- * A helper class for double comparison.
- */
-public class DoubleCompareHolder {
-  // TODO(dankurka): replace this with @JsFunction once its available in GWT.
-  public static native Object getDoubleComparator() /*-{
-      return @java.lang.Double::compare(*);
-  }-*/;
-}
-
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/LongCompareHolder.java b/user/super/com/google/gwt/emul/javaemul/internal/LongCompareHolder.java
deleted file mode 100644
index 5a75c7c..0000000
--- a/user/super/com/google/gwt/emul/javaemul/internal/LongCompareHolder.java
+++ /dev/null
@@ -1,27 +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 javaemul.internal;
-
-/**
- * A helper class for long comparison.
- */
-public class LongCompareHolder {
-  // TODO(dankurka): replace this with @JsFunction once its available in GWT.
-  public static native Object getLongComparator() /*-{
-    return @com.google.gwt.lang.LongLib::compare(*);
-  }-*/;
-}
-
