diff --git a/user/super/com/google/gwt/emul/java/lang/reflect/Array.java b/user/super/com/google/gwt/emul/java/lang/reflect/Array.java
index f9a3a6c..4695ebc 100644
--- a/user/super/com/google/gwt/emul/java/lang/reflect/Array.java
+++ b/user/super/com/google/gwt/emul/java/lang/reflect/Array.java
@@ -82,8 +82,24 @@
   }
 
   public static double getDouble(Object array, int index) {
-    checkArgument(array instanceof double[]);
-    return getDoubleImpl(array, index);
+    if (array instanceof double[]) {
+      return getDoubleImpl(array, index);
+    } else if (array instanceof byte[]) {
+      return getByteImpl(array, index);
+    } else if (array instanceof char[]) {
+      return getCharImpl(array, index);
+    } else if (array instanceof float[]) {
+      return getFloatImpl(array, index);
+    } else if (array instanceof int[]) {
+      return getIntImpl(array, index);
+    } else if (array instanceof long[]) {
+      return getLongImpl(array, index);
+    } else if (array instanceof short[]) {
+      return getShortImpl(array, index);
+    } else {
+      checkArgument(false);
+      return 0;
+    }
   }
 
   private static double getDoubleImpl(Object array, int index) {
@@ -92,8 +108,22 @@
   }
 
   public static float getFloat(Object array, int index) {
-    checkArgument(array instanceof float[]);
-    return getFloatImpl(array, index);
+    if (array instanceof float[]) {
+      return getFloatImpl(array, index);
+    } else if (array instanceof byte[]) {
+      return getByteImpl(array, index);
+    } else if (array instanceof char[]) {
+      return getCharImpl(array, index);
+    } else if (array instanceof int[]) {
+      return getIntImpl(array, index);
+    } else if (array instanceof long[]) {
+      return getLongImpl(array, index);
+    } else if (array instanceof short[]) {
+      return getShortImpl(array, index);
+    } else {
+      checkArgument(false);
+      return 0;
+    }
   }
 
   private static float getFloatImpl(Object array, int index) {
@@ -102,8 +132,18 @@
   }
 
   public static int getInt(Object array, int index) {
-    checkArgument(array instanceof int[]);
-    return getIntImpl(array, index);
+    if (array instanceof int[]) {
+      return getIntImpl(array, index);
+    } else if (array instanceof byte[]) {
+      return getByteImpl(array, index);
+    } else if (array instanceof char[]) {
+      return getCharImpl(array, index);
+    } else if (array instanceof short[]) {
+      return getShortImpl(array, index);
+    } else {
+      checkArgument(false);
+      return 0;
+    }
   }
 
   private static int getIntImpl(Object array, int index) {
@@ -117,8 +157,20 @@
   }
 
   public static long getLong(Object array, int index) {
-    checkArgument(array instanceof long[]);
-    return getLongImpl(array, index);
+    if (array instanceof long[]) {
+      return getLongImpl(array, index);
+    } else if (array instanceof byte[]) {
+      return getByteImpl(array, index);
+    } else if (array instanceof char[]) {
+      return getCharImpl(array, index);
+    } else if (array instanceof int[]) {
+      return getIntImpl(array, index);
+    } else if (array instanceof short[]) {
+      return getShortImpl(array, index);
+    } else {
+      checkArgument(false);
+      return 0;
+    }
   }
 
   private static long getLongImpl(Object array, int index) {
@@ -127,8 +179,14 @@
   }
 
   public static short getShort(Object array, int index) {
-    checkArgument(array instanceof short[]);
-    return getShortImpl(array, index);
+    if (array instanceof short[]) {
+      return getShortImpl(array, index);
+    } else if (array instanceof byte[]) {
+      return getByteImpl(array, index);
+    } else {
+      checkArgument(false);
+      return 0;
+    }
   }
 
   private static short getShortImpl(Object array, int index) {
@@ -137,26 +195,29 @@
   }
 
   public static void set(Object array, int index, Object value) {
-    if (array instanceof boolean[]) {
-      setBooleanImpl(array, index, (Boolean) value);
-    } else if (array instanceof byte[]) {
-      setByteImpl(array, index, (Byte) value);
-    } else if (array instanceof char[]) {
-      setCharImpl(array, index, (Character) value);
-    } else if (array instanceof double[]) {
-      setDoubleImpl(array, index, (Double) value);
-    } else if (array instanceof float[]) {
-      setFloatImpl(array, index, (Float) value);
-    } else if (array instanceof int[]) {
-      setIntImpl(array, index, (Integer) value);
-    } else if (array instanceof long[]) {
-      setLongImpl(array, index, (Long) value);
-    } else if (array instanceof short[]) {
-      setShortImpl(array, index, (Short) value);
-    } else {
-      checkArgument(array instanceof Object[]);
+    if (array instanceof Object[]) {
       Object[] typedArray = (Object[]) array;
       typedArray[index] = value;
+    } else {
+      if (value instanceof Boolean) {
+        setBoolean(array, index, ((Boolean) value).booleanValue());
+      } else if (value instanceof Byte) {
+        setByte(array, index, ((Byte) value).byteValue());
+      } else if (value instanceof Character) {
+        setChar(array, index, ((Character) value).charValue());
+      } else if (value instanceof Short) {
+        setShort(array, index, ((Short) value).shortValue());
+      } else if (value instanceof Integer) {
+        setInt(array, index, ((Integer) value).intValue());
+      } else if (value instanceof Long) {
+        setLong(array, index, ((Long) value).longValue());
+      } else if (value instanceof Float) {
+        setFloat(array, index, ((Float) value).floatValue());
+      } else if (value instanceof Double) {
+        setDouble(array, index, ((Double) value).doubleValue());
+      } else {
+        checkArgument(false);
+      }
     }
   }
 
@@ -171,8 +232,21 @@
   }
 
   public static void setByte(Object array, int index, byte value) {
-    checkArgument(array instanceof byte[]);
-    setByteImpl(array, index, value);
+    if (array instanceof byte[]) {
+      setByteImpl(array, index, value);
+    } else if (array instanceof double[]) {
+      setDoubleImpl(array, index, value);
+    } else if (array instanceof float[]) {
+      setFloatImpl(array, index, value);
+    } else if (array instanceof int[]) {
+      setIntImpl(array, index, value);
+    } else if (array instanceof long[]) {
+      setLongImpl(array, index, value);
+    } else if (array instanceof short[]) {
+      setShortImpl(array, index, value);
+    } else {
+      checkArgument(false);
+    }
   }
 
   private static void setByteImpl(Object array, int index, byte value) {
@@ -181,8 +255,19 @@
   }
 
   public static void setChar(Object array, int index, char value) {
-    checkArgument(array instanceof char[]);
-    setCharImpl(array, index, value);
+    if (array instanceof char[]) {
+      setCharImpl(array, index, value);
+    } else if (array instanceof double[]) {
+      setDoubleImpl(array, index, value);
+    } else if (array instanceof float[]) {
+      setFloatImpl(array, index, value);
+    } else if (array instanceof int[]) {
+      setIntImpl(array, index, value);
+    } else if (array instanceof long[]) {
+      setLongImpl(array, index, value);
+    } else {
+      checkArgument(false);
+    }
   }
 
   private static void setCharImpl(Object array, int index, char value) {
@@ -201,8 +286,13 @@
   }
 
   public static void setFloat(Object array, int index, float value) {
-    checkArgument(array instanceof float[]);
-    setFloatImpl(array, index, value);
+    if (array instanceof float[]) {
+      setFloatImpl(array, index, value);
+    } else if (array instanceof double[]) {
+      setDoubleImpl(array, index, value);
+    } else {
+      checkArgument(false);
+    }
   }
 
   private static void setFloatImpl(Object array, int index, float value) {
@@ -211,8 +301,17 @@
   }
 
   public static void setInt(Object array, int index, int value) {
-    checkArgument(array instanceof int[]);
-    setIntImpl(array, index, value);
+    if (array instanceof int[]) {
+      setIntImpl(array, index, value);
+    } else if (array instanceof double[]) {
+      setDoubleImpl(array, index, value);
+    } else if (array instanceof float[]) {
+      setFloatImpl(array, index, value);
+    } else if (array instanceof long[]) {
+      setLongImpl(array, index, value);
+    } else {
+      checkArgument(false);
+    }
   }
 
   private static void setIntImpl(Object array, int index, int value) {
@@ -221,8 +320,15 @@
   }
 
   public static void setLong(Object array, int index, long value) {
-    checkArgument(array instanceof long[]);
-    setLongImpl(array, index, value);
+    if (array instanceof long[]) {
+      setLongImpl(array, index, value);
+    } else if (array instanceof double[]) {
+      setDoubleImpl(array, index, value);
+    } else if (array instanceof float[]) {
+      setFloatImpl(array, index, value);
+    } else {
+      checkArgument(false);
+    }
   }
 
   private static void setLongImpl(Object array, int index, long value) {
@@ -231,8 +337,19 @@
   }
 
   public static void setShort(Object array, int index, short value) {
-    checkArgument(array instanceof short[]);
-    setShortImpl(array, index, value);
+    if (array instanceof short[]) {
+      setShortImpl(array, index, value);
+    } else if (array instanceof double[]) {
+      setDoubleImpl(array, index, value);
+    } else if (array instanceof float[]) {
+      setFloatImpl(array, index, value);
+    } else if (array instanceof int[]) {
+      setIntImpl(array, index, value);
+    } else if (array instanceof long[]) {
+      setLongImpl(array, index, value);
+    } else {
+      checkArgument(false);
+    }
   }
 
   private static void setShortImpl(Object array, int index, short value) {
diff --git a/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java b/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java
index 420248c..9a8472f 100644
--- a/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/reflect/ArrayTest.java
@@ -143,6 +143,12 @@
     }
 
     assertEquals(1.0d, Array.getDouble(new double[] {1.0d}, 0));
+    assertEquals(1.0d, Array.getDouble(new float[] {1.0f}, 0));
+    assertEquals(1.0d, Array.getDouble(new byte[] {1}, 0));
+    assertEquals(1.0d, Array.getDouble(new char[] {1}, 0));
+    assertEquals(1.0d, Array.getDouble(new int[] {1}, 0));
+    assertEquals(1.0d, Array.getDouble(new long[] {1}, 0));
+    assertEquals(1.0d, Array.getDouble(new short[] {1}, 0));
   }
 
   public void testGetFloat() {
@@ -165,6 +171,11 @@
     }
 
     assertEquals(1.0f, Array.getFloat(new float[] {1.0f}, 0));
+    assertEquals(1.0f, Array.getFloat(new byte[] {1}, 0));
+    assertEquals(1.0f, Array.getFloat(new char[] {1}, 0));
+    assertEquals(1.0f, Array.getFloat(new int[] {1}, 0));
+    assertEquals(1.0f, Array.getFloat(new long[] {1}, 0));
+    assertEquals(1.0f, Array.getFloat(new short[] {1}, 0));
   }
 
   public void testGetInt() {
@@ -187,6 +198,9 @@
     }
 
     assertEquals(1, Array.getInt(new int[] {1}, 0));
+    assertEquals(1, Array.getInt(new byte[] {1}, 0));
+    assertEquals(1, Array.getInt(new char[] {1}, 0));
+    assertEquals(1, Array.getInt(new short[] {1}, 0));
   }
 
   public void testGetLength() {
@@ -222,6 +236,10 @@
     }
 
     assertEquals(1L, Array.getLong(new long[] {1L}, 0));
+    assertEquals(1L, Array.getLong(new byte[] {1}, 0));
+    assertEquals(1L, Array.getLong(new char[] {1}, 0));
+    assertEquals(1L, Array.getLong(new int[] {1}, 0));
+    assertEquals(1L, Array.getLong(new short[] {1}, 0));
   }
 
   public void testGetShort() {
@@ -244,6 +262,7 @@
     }
 
     assertEquals((short) 1, Array.getShort(new short[] {(short) 1}, 0));
+    assertEquals((short) 1, Array.getShort(new short[] {1}, 0));
   }
 
   public void testSet() {
@@ -294,6 +313,39 @@
     short[] shortArray = new short[1];
     Array.set(shortArray, 0, (short) 1);
     assertEquals((short) 1, shortArray[0]);
+
+    // test widening
+    long[] otherLongArray = new long[10];
+    Array.set(otherLongArray, 0, (byte) 2);
+    assertEquals(2L, otherLongArray[0]);
+
+    Array.set(otherLongArray, 1, (short) 3);
+    assertEquals(3L, otherLongArray[1]);
+
+    Array.set(otherLongArray, 2, (char) 4);
+    assertEquals(4L, otherLongArray[2]);
+
+    Array.set(otherLongArray, 3, 5);
+    assertEquals(5L, otherLongArray[3]);
+
+    double[] otherDoubleArray = new double[10];
+    Array.set(otherDoubleArray, 0, (byte) 2);
+    assertEquals(2d, otherDoubleArray[0], 0.00001);
+
+    Array.set(otherDoubleArray, 1, (short) 3);
+    assertEquals(3d, otherDoubleArray[1], 0.00001);
+
+    Array.set(otherDoubleArray, 2, (char) 4);
+    assertEquals(4d, otherDoubleArray[2], 0.00001);
+
+    Array.set(otherDoubleArray, 3, 5);
+    assertEquals(5d, otherDoubleArray[3], 0.00001);
+
+    Array.set(otherDoubleArray, 4, (float) 6);
+    assertEquals(6d, otherDoubleArray[4], 0.00001);
+
+    Array.set(otherDoubleArray, 5, (double) 7);
+    assertEquals(7d, otherDoubleArray[5], 0.00001);
   }
 
   public void testSetBoolean() {
@@ -328,10 +380,29 @@
     } catch (RuntimeException expected) {
     }
 
-    byte[] array = new byte[1];
+    byte[] bArray = new byte[1];
+    Array.setByte(bArray, 0, (byte) 1);
+    assertEquals((byte) 1, bArray[0]);
 
-    Array.setByte(array, 0, (byte) 1);
-    assertEquals((byte) 1, array[0]);
+    double[] dArray = new double[1];
+    Array.setByte(dArray, 0, (byte) 1);
+    assertEquals((byte) 1, (byte) dArray[0]);
+
+    float[] fArray = new float[1];
+    Array.setByte(fArray, 0, (byte) 1);
+    assertEquals((byte) 1, (byte) fArray[0]);
+
+    int[] iArray = new int[1];
+    Array.setByte(iArray, 0, (byte) 1);
+    assertEquals((byte) 1, (byte) iArray[0]);
+
+    long[] lArray = new long[1];
+    Array.setByte(lArray, 0, (byte) 1);
+    assertEquals((byte) 1, (byte) lArray[0]);
+
+    short[] sArray = new short[1];
+    Array.setByte(sArray, 0, (byte) 1);
+    assertEquals((byte) 1, (byte) sArray[0]);
   }
 
   public void testSetChar() {
@@ -351,6 +422,22 @@
 
     Array.setChar(array, 0, 'a');
     assertEquals('a', array[0]);
+
+    double[] dArray = new double[1];
+    Array.setChar(dArray, 0, (char) 1);
+    assertEquals((byte) 1, (byte) dArray[0]);
+
+    float[] fArray = new float[1];
+    Array.setChar(fArray, 0, (char) 1);
+    assertEquals((byte) 1, (byte) fArray[0]);
+
+    int[] iArray = new int[1];
+    Array.setChar(iArray, 0, (char) 1);
+    assertEquals((byte) 1, (byte) iArray[0]);
+
+    long[] lArray = new long[1];
+    Array.setChar(lArray, 0, (char) 1);
+    assertEquals((byte) 1, (byte) lArray[0]);
   }
 
   public void testSetDouble() {
@@ -389,6 +476,10 @@
 
     Array.setFloat(array, 0, 1.0f);
     assertEquals(1.0f, array[0]);
+
+    double[] dArray = new double[1];
+    Array.setFloat(dArray, 0, 1);
+    assertEquals((float) 1, (float) dArray[0]);
   }
 
   public void testSetInt() {
@@ -408,6 +499,18 @@
 
     Array.setInt(array, 0, 1);
     assertEquals(1, array[0]);
+
+    double[] dArray = new double[1];
+    Array.setInt(dArray, 0, 1);
+    assertEquals(1, (int) dArray[0]);
+
+    float[] fArray = new float[1];
+    Array.setInt(fArray, 0, 1);
+    assertEquals(1, (int) fArray[0]);
+
+    long[] lArray = new long[1];
+    Array.setInt(lArray, 0, 1);
+    assertEquals(1, (int) lArray[0]);
   }
 
   public void testSetLong() {
@@ -427,6 +530,14 @@
 
     Array.setLong(array, 0, 1L);
     assertEquals(1L, array[0]);
+
+    double[] dArray = new double[1];
+    Array.setLong(dArray, 0, 1);
+    assertEquals(1L, (long) dArray[0]);
+
+    float[] fArray = new float[1];
+    Array.setLong(fArray, 0, 1);
+    assertEquals(1L, (long) fArray[0]);
   }
 
   public void testSetShort() {
@@ -446,5 +557,21 @@
 
     Array.setShort(array, 0, (short) 1);
     assertEquals((short) 1, array[0]);
+
+    int[] iArray = new int[1];
+    Array.setShort(iArray, 0, (short) 1);
+    assertEquals((short) 1, (short) iArray[0]);
+
+    double[] dArray = new double[1];
+    Array.setShort(dArray, 0, (short) 1);
+    assertEquals((short) 1, (short) dArray[0]);
+
+    float[] fArray = new float[1];
+    Array.setShort(fArray, 0, (short) 1);
+    assertEquals((short) 1, (short) fArray[0]);
+
+    long[] lArray = new long[1];
+    Array.setShort(lArray, 0, (short) 1);
+    assertEquals((short) 1, (short) lArray[0]);
   }
 }
