diff --git a/user/test/com/google/gwt/emultest/CollectionsSuite.java b/user/test/com/google/gwt/emultest/CollectionsSuite.java
index 95d76a6..a273ee0 100644
--- a/user/test/com/google/gwt/emultest/CollectionsSuite.java
+++ b/user/test/com/google/gwt/emultest/CollectionsSuite.java
@@ -17,6 +17,8 @@
 
 import com.google.gwt.emultest.java.util.ArrayDequeTest;
 import com.google.gwt.emultest.java.util.ArrayListTest;
+import com.google.gwt.emultest.java.util.ArraysDoubleSemanticsTest;
+import com.google.gwt.emultest.java.util.ArraysFloatSemanticsTest;
 import com.google.gwt.emultest.java.util.ArraysTest;
 import com.google.gwt.emultest.java.util.BitSetTest;
 import com.google.gwt.emultest.java.util.CollectionsTest;
@@ -38,7 +40,6 @@
 import com.google.gwt.emultest.java.util.TreeSetIntegerTest;
 import com.google.gwt.emultest.java.util.TreeSetIntegerWithComparatorTest;
 import com.google.gwt.emultest.java.util.VectorTest;
-
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
@@ -48,6 +49,8 @@
 @SuiteClasses({
   ArrayDequeTest.class,
   ArrayListTest.class,
+  ArraysDoubleSemanticsTest.class,
+  ArraysFloatSemanticsTest.class,
   ArraysTest.class,
   BitSetTest.class,
   CollectionsTest.class,
@@ -72,4 +75,4 @@
   // Put last to reduce number of times the test framework switches modules
   HashMapSmokeTest.class,
 })
-public class CollectionsSuite { }
+public class CollectionsSuite {}
diff --git a/user/test/com/google/gwt/emultest/EmulSuite.java b/user/test/com/google/gwt/emultest/EmulSuite.java
index f9246e2..575fd5b 100644
--- a/user/test/com/google/gwt/emultest/EmulSuite.java
+++ b/user/test/com/google/gwt/emultest/EmulSuite.java
@@ -26,7 +26,9 @@
 import com.google.gwt.emultest.java.lang.ByteTest;
 import com.google.gwt.emultest.java.lang.CharacterTest;
 import com.google.gwt.emultest.java.lang.CompilerConstantStringTest;
+import com.google.gwt.emultest.java.lang.DoubleEqualsSemanticsTest;
 import com.google.gwt.emultest.java.lang.DoubleTest;
+import com.google.gwt.emultest.java.lang.FloatEqualsSemanticsTest;
 import com.google.gwt.emultest.java.lang.FloatTest;
 import com.google.gwt.emultest.java.lang.IntegerTest;
 import com.google.gwt.emultest.java.lang.JsExceptionTest;
@@ -56,8 +58,6 @@
 import com.google.gwt.emultest.java.util.DateTest;
 import com.google.gwt.emultest.java.util.ObjectsTest;
 import com.google.gwt.emultest.java.util.RandomTest;
-
-
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
@@ -81,7 +81,9 @@
   CharacterTest.class,
   CompilerConstantStringTest.class,
   DoubleTest.class,
+  DoubleEqualsSemanticsTest.class,
   FloatTest.class,
+  FloatEqualsSemanticsTest.class,
   IntegerTest.class,
   JsExceptionTest.class,
   LongTest.class,
@@ -127,4 +129,4 @@
   // Put last to reduce number of times the test framework switches modules
   MathContextWithObfuscatedEnumsTest.class,
 })
-public class EmulSuite { }
+public class EmulSuite {}
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleEqualsSemanticsTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleEqualsSemanticsTest.java
new file mode 100644
index 0000000..c9112fb
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleEqualsSemanticsTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 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.emultest.java.lang;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.testing.TestUtils;
+
+/** Tests (incorrect) equals semantics for Double. */
+public final class DoubleEqualsSemanticsTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.emultest.EmulSuite";
+  }
+
+  public void testEquals() {
+    // Semantics don't match JVM.
+    if (TestUtils.isJvm()) {
+      return;
+    }
+
+    // Should be assertTrue(Double.valueOf(Double.NaN).equals(Double.NaN));
+    assertFalse(Double.valueOf(Double.NaN).equals(Double.NaN));
+    // Should be assertFalse(Double.valueOf(0.0d).equals(-0.0d));
+    assertTrue(Double.valueOf(0.0d).equals(-0.0d));
+
+    // Also make sure the behavior doesn't change when Object trampoline is used.
+    Object o;
+    o = Double.NaN;
+    // Should be assertTrue(o.equals(Double.NaN));
+    assertFalse(o.equals(Double.NaN));
+    o = 0.0d;
+    // Should be assertFalse
+    assertTrue(o.equals(-0.0d));
+  }
+}
diff --git a/user/test/com/google/gwt/emultest/java/lang/FloatEqualsSemanticsTest.java b/user/test/com/google/gwt/emultest/java/lang/FloatEqualsSemanticsTest.java
new file mode 100644
index 0000000..7b95eba
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/lang/FloatEqualsSemanticsTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2019 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.emultest.java.lang;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.testing.TestUtils;
+
+/** Tests (incorrect) equals semantics for Float. */
+public final class FloatEqualsSemanticsTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.emultest.EmulSuite";
+  }
+
+  public void testEquals() {
+    // Semantics don't match JVM.
+    if (TestUtils.isJvm()) {
+      return;
+    }
+
+    // Should be assertTrue(Float.valueOf(Float.NaN).equals(Float.NaN));
+    assertFalse(Float.valueOf(Float.NaN).equals(Float.NaN));
+    // Should be assertFalse(Float.valueOf(0.0f).equals(-0.0f));
+    assertTrue(Float.valueOf(0.0f).equals(-0.0f));
+  }
+}
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java
new file mode 100644
index 0000000..e1429c9
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019 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.emultest.java.util;
+
+import com.google.gwt.testing.TestUtils;
+import java.util.Arrays;
+
+/** Tests {@link Arrays} (incorrect) Double semantics. */
+public class ArraysDoubleSemanticsTest extends EmulTestBase {
+
+  public void testEquals() throws Exception {
+    // Semantics don't match JVM.
+    if (TestUtils.isJvm()) {
+      return;
+    }
+
+    // Should be assertFalse(Arrays.equals(new Double[] {-0.0d}, new Double[] {0.0d}));
+    assertTrue(Arrays.equals(new Double[] {-0.0d}, new Double[] {0.0d}));
+    // Should be assertTrue(Arrays.equals(new Double[] {-0.0d}, new Double[] {0.0d}));
+    assertFalse(Arrays.equals(new Double[] {Double.NaN}, new Double[] {Double.NaN}));
+
+    // Should be assertFalse(Arrays.equals(new double[] {-0.0d}, new double[] {0.0d}));
+    assertTrue(Arrays.equals(new double[] {-0.0d}, new double[] {0.0d}));
+    // Should be assertTrue(Arrays.equals(new double[] {Double.NaN}, new double[] {Double.NaN}));
+    assertFalse(Arrays.equals(new double[] {Double.NaN}, new double[] {Double.NaN}));
+  }
+
+  public void testBinarySearch() throws Exception {
+    // Semantics don't match JVM.
+    if (TestUtils.isJvm()) {
+      return;
+    }
+
+    // Should be assertEquals(-1, Arrays.binarySearch(new double[] {-0.0d}, 0.0d));
+    assertEquals(0, Arrays.binarySearch(new double[] {-0.0d}, 0.0d));
+    // Should be assertEquals(-1, Arrays.binarySearch(new double[] {0.0d}, Double.NaN));
+    assertEquals(0, Arrays.binarySearch(new double[] {0.0d}, Double.NaN));
+    // Should be assertEquals(1, Arrays.binarySearch(new double[] {0.0d, Double.NaN}, Double.NaN));
+    assertEquals(0, Arrays.binarySearch(new double[] {0.0d, Double.NaN}, Double.NaN));
+  }
+}
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java
new file mode 100644
index 0000000..31de695
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019 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.emultest.java.util;
+
+import com.google.gwt.testing.TestUtils;
+import java.util.Arrays;
+
+/** Tests {@link Arrays} (incorrect) Float semantics. */
+public class ArraysFloatSemanticsTest extends EmulTestBase {
+
+  public void testEquals() throws Exception {
+    // Semantics don't match JVM.
+    if (TestUtils.isJvm()) {
+      return;
+    }
+
+    // Should be assertFalse(Arrays.equals(new Float[] {-0.0f}, new Float[] {0.0f}));
+    assertTrue(Arrays.equals(new Float[] {-0.0f}, new Float[] {0.0f}));
+    // Should be assertTrue(Arrays.equals(new Float[] {Float.NaN}, new Float[] {Float.NaN}));
+    assertFalse(Arrays.equals(new Float[] {Float.NaN}, new Float[] {Float.NaN}));
+
+    // Should be assertFalse(Arrays.equals(new float[] {-0.0f}, new float[] {0.0f}));
+    assertTrue(Arrays.equals(new float[] {-0.0f}, new float[] {0.0f}));
+    // Should be assertTrue(Arrays.equals(new float[] {Float.NaN}, new float[] {Float.NaN}));
+    assertFalse(Arrays.equals(new float[] {Float.NaN}, new float[] {Float.NaN}));
+  }
+
+  public void testBinarySearch() throws Exception {
+    // Semantics don't match JVM.
+    if (TestUtils.isJvm()) {
+      return;
+    }
+
+    // Should be assertEquals(-1, Arrays.binarySearch(new float[] {-0.0f}, 0.0f));
+    assertEquals(0, Arrays.binarySearch(new float[] {-0.0f}, 0.0f));
+    // Should be assertEquals(-1, Arrays.binarySearch(new float[] {0.0f}, Float.NaN));
+    assertEquals(0, Arrays.binarySearch(new float[] {0.0f}, Float.NaN));
+    // Should be assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN));
+    assertEquals(0, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN));
+  }
+}
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
index 73f8ee6..47d4e47 100644
--- a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
@@ -448,6 +448,18 @@
     assertEquals(-2, ret);
   }
 
+  public void testBinarySearchBoxed() {
+    assertEquals(1, Arrays.binarySearch(new Double[] {-0.0d, -0.0d, -0.0d}, -0.0d));
+    assertEquals(-4, Arrays.binarySearch(new Double[] {-0.0d, -0.0d, -0.0d}, 0.0d));
+    assertEquals(0, Arrays.binarySearch(new Double[] {Double.NaN}, Double.NaN));
+    assertEquals(-2, Arrays.binarySearch(new Double[] {0.0d}, Double.NaN));
+
+    assertEquals(1, Arrays.binarySearch(new Float[] {-0.0f, -0.0f, -0.0f}, -0.0f));
+    assertEquals(-4, Arrays.binarySearch(new Float[] {-0.0f, -0.0f, -0.0f}, 0.0f));
+    assertEquals(0, Arrays.binarySearch(new Float[] {Float.NaN}, Float.NaN));
+    assertEquals(-2, Arrays.binarySearch(new Float[] {0.0f}, Float.NaN));
+  }
+
   /**
    * Test Arrays.binarySearch(Object[], Object, Comparator).
    * 
