diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 5e106c2..18e1a5b 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -16,7 +16,6 @@
 
 package java.lang;
 
-import static javaemul.internal.InternalPreconditions.checkNotNull;
 import static javaemul.internal.InternalPreconditions.checkStringBounds;
 
 import java.io.Serializable;
@@ -113,8 +112,6 @@
   }
 
   public static String join(CharSequence delimiter, CharSequence... elements) {
-    checkNotNull(delimiter, "delimiter");
-    checkNotNull(elements, "elements");
     StringJoiner joiner = new StringJoiner(delimiter);
     for (CharSequence e : elements) {
       joiner.add(e);
@@ -123,8 +120,6 @@
   }
 
   public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements) {
-    checkNotNull(delimiter, "delimiter");
-    checkNotNull(elements, "elements");
     StringJoiner joiner = new StringJoiner(delimiter);
     for (CharSequence e : elements) {
       joiner.add(e);
diff --git a/user/super/com/google/gwt/emul/java/util/Comparator.java b/user/super/com/google/gwt/emul/java/util/Comparator.java
index e0a9813..9b8235d 100644
--- a/user/super/com/google/gwt/emul/java/util/Comparator.java
+++ b/user/super/com/google/gwt/emul/java/util/Comparator.java
@@ -15,7 +15,7 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
+import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.io.Serializable;
 import java.util.function.Function;
@@ -43,7 +43,7 @@
   }
 
   default Comparator<T> thenComparing(Comparator<? super T> other) {
-    checkCriticalNotNull(other);
+    checkNotNull(other);
     return (Comparator<T> & Serializable) (a, b) -> {
       int c = compare(a, b);
       return (c != 0) ? c : other.compare(a, b);
@@ -74,8 +74,8 @@
 
   static <T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor,
       Comparator<? super U> keyComparator) {
-    checkCriticalNotNull(keyExtractor);
-    checkCriticalNotNull(keyComparator);
+    checkNotNull(keyExtractor);
+    checkNotNull(keyComparator);
     return (Comparator<T> & Serializable) (a, b) ->
         keyComparator.compare(keyExtractor.apply(a), keyExtractor.apply(b));
   }
@@ -86,19 +86,19 @@
   }
 
   static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) {
-    checkCriticalNotNull(keyExtractor);
+    checkNotNull(keyExtractor);
     return (Comparator<T> & Serializable) (a, b) ->
         Double.compare(keyExtractor.applyAsDouble(a), keyExtractor.applyAsDouble(b));
   }
 
   static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
-    checkCriticalNotNull(keyExtractor);
+    checkNotNull(keyExtractor);
     return (Comparator<T> & Serializable) (a, b) ->
         Integer.compare(keyExtractor.applyAsInt(a), keyExtractor.applyAsInt(b));
   }
 
   static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) {
-    checkCriticalNotNull(keyExtractor);
+    checkNotNull(keyExtractor);
     return (Comparator<T> & Serializable) (a, b) ->
         Long.compare(keyExtractor.applyAsLong(a), keyExtractor.applyAsLong(b));
   }
diff --git a/user/super/com/google/gwt/emul/java/util/Map.java b/user/super/com/google/gwt/emul/java/util/Map.java
index c5cccd2..41e6449 100644
--- a/user/super/com/google/gwt/emul/java/util/Map.java
+++ b/user/super/com/google/gwt/emul/java/util/Map.java
@@ -15,7 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.io.Serializable;
@@ -52,7 +51,7 @@
     }
 
     static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
-      checkCriticalNotNull(cmp);
+      checkNotNull(cmp);
       return (Comparator<Map.Entry<K, V>> & Serializable)
           (a, b) -> cmp.compare(a.getKey(), b.getKey());
     }
@@ -62,7 +61,7 @@
     }
 
     static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
-      checkCriticalNotNull(cmp);
+      checkNotNull(cmp);
       return (Comparator<Map.Entry<K, V>> & Serializable)
           (a, b) -> cmp.compare(a.getValue(), b.getValue());
     }
diff --git a/user/super/com/google/gwt/emul/java/util/Optional.java b/user/super/com/google/gwt/emul/java/util/Optional.java
index 51b5f15..8dc4a8f 100644
--- a/user/super/com/google/gwt/emul/java/util/Optional.java
+++ b/user/super/com/google/gwt/emul/java/util/Optional.java
@@ -22,6 +22,7 @@
 
 import static javaemul.internal.InternalPreconditions.checkCriticalElement;
 import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
+import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 /**
  * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html">
@@ -37,23 +38,19 @@
   }
 
   public static <T> Optional<T> of(T value) {
-    return new Optional<>(value);
+    return new Optional<>(checkCriticalNotNull(value));
   }
 
   public static <T> Optional<T> ofNullable(T value) {
     return value == null ? empty() : of(value);
   }
 
-  private static final Optional<?> EMPTY = new Optional<>();
+  private static final Optional<?> EMPTY = new Optional<>(null);
 
   private final T ref;
 
-  private Optional() {
-    ref = null;
-  }
-
   private Optional(T ref) {
-    this.ref = checkCriticalNotNull(ref);
+    this.ref = ref;
   }
 
   public boolean isPresent() {
@@ -72,7 +69,7 @@
   }
 
   public Optional<T> filter(Predicate<? super T> predicate) {
-    checkCriticalNotNull(predicate);
+    checkNotNull(predicate);
     if (!isPresent() || predicate.test(ref)) {
       return this;
     }
@@ -80,7 +77,7 @@
   }
 
   public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
-    checkCriticalNotNull(mapper);
+    checkNotNull(mapper);
     if (isPresent()) {
       return ofNullable(mapper.apply(ref));
     }
@@ -88,9 +85,9 @@
   }
 
   public <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
-    checkCriticalNotNull(mapper);
+    checkNotNull(mapper);
     if (isPresent()) {
-      return checkCriticalNotNull(mapper.apply(ref));
+      return checkNotNull(mapper.apply(ref));
     }
     return empty();
   }
diff --git a/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java b/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java
index a08b931..e80f586 100644
--- a/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java
+++ b/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java
@@ -15,7 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.util.function.Consumer;
@@ -59,7 +58,6 @@
       if (consumer instanceof DoubleConsumer) {
         forEachRemaining((DoubleConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((DoubleConsumer) consumer::accept);
       }
     }
@@ -90,7 +88,6 @@
       if (consumer instanceof IntConsumer) {
         forEachRemaining((IntConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((IntConsumer) consumer::accept);
       }
     }
@@ -121,7 +118,6 @@
       if (consumer instanceof LongConsumer) {
         forEachRemaining((LongConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((LongConsumer) consumer::accept);
       }
     }
diff --git a/user/super/com/google/gwt/emul/java/util/Spliterator.java b/user/super/com/google/gwt/emul/java/util/Spliterator.java
index 365efd2..96abc22 100644
--- a/user/super/com/google/gwt/emul/java/util/Spliterator.java
+++ b/user/super/com/google/gwt/emul/java/util/Spliterator.java
@@ -15,9 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
-import static javaemul.internal.InternalPreconditions.checkNotNull;
-
 import java.util.function.Consumer;
 import java.util.function.DoubleConsumer;
 import java.util.function.IntConsumer;
@@ -52,7 +49,6 @@
   long estimateSize();
 
   default void forEachRemaining(Consumer<? super T> consumer) {
-    checkNotNull(consumer);
     while (tryAdvance(consumer)) { }
   }
 
@@ -88,7 +84,6 @@
     S trySplit();
 
     default void forEachRemaining(C consumer) {
-      checkNotNull(consumer);
       while (tryAdvance(consumer)) { }
     }
   }
@@ -103,7 +98,6 @@
       if (consumer instanceof DoubleConsumer) {
         return tryAdvance((DoubleConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         return tryAdvance((DoubleConsumer) consumer::accept);
       }
     }
@@ -113,7 +107,6 @@
       if (consumer instanceof DoubleConsumer) {
         forEachRemaining((DoubleConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((DoubleConsumer) consumer::accept);
       }
     }
@@ -129,7 +122,6 @@
       if (consumer instanceof IntConsumer) {
         return tryAdvance((IntConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         return tryAdvance((IntConsumer) consumer::accept);
       }
     }
@@ -139,7 +131,6 @@
       if (consumer instanceof IntConsumer) {
         forEachRemaining((IntConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((IntConsumer) consumer::accept);
       }
     }
@@ -155,7 +146,6 @@
       if (consumer instanceof LongConsumer) {
         return tryAdvance((LongConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         return tryAdvance((LongConsumer) consumer::accept);
       }
     }
@@ -165,7 +155,6 @@
       if (consumer instanceof LongConsumer) {
         forEachRemaining((LongConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((LongConsumer) consumer::accept);
       }
     }
diff --git a/user/super/com/google/gwt/emul/java/util/Spliterators.java b/user/super/com/google/gwt/emul/java/util/Spliterators.java
index 7e44465..f14bad7 100644
--- a/user/super/com/google/gwt/emul/java/util/Spliterators.java
+++ b/user/super/com/google/gwt/emul/java/util/Spliterators.java
@@ -15,8 +15,8 @@
  */
 package java.util;
 
+import static javaemul.internal.InternalPreconditions.checkCriticalArrayBounds;
 import static javaemul.internal.InternalPreconditions.checkCriticalElement;
-import static javaemul.internal.InternalPreconditions.checkCriticalPositionIndexes;
 import static javaemul.internal.InternalPreconditions.checkCriticalState;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
@@ -586,7 +586,7 @@
     private final int characteristics;
 
     BaseArraySpliterator(int from, int limit, int size, int characteristics) {
-      checkCriticalPositionIndexes(from, limit, size);
+      checkCriticalArrayBounds(from, limit, size);
       this.index = from;
       this.limit = limit;
       this.characteristics = sizeKnownSpliteratorCharacteristics(characteristics);
diff --git a/user/super/com/google/gwt/emul/java/util/StringJoiner.java b/user/super/com/google/gwt/emul/java/util/StringJoiner.java
index 8aba2fa..6f26084 100644
--- a/user/super/com/google/gwt/emul/java/util/StringJoiner.java
+++ b/user/super/com/google/gwt/emul/java/util/StringJoiner.java
@@ -15,8 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkNotNull;
-
 /**
  * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html">
  * the official Java API doc</a> for details.
@@ -35,9 +33,6 @@
   }
 
   public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
-    checkNotNull(delimiter, "delimiter");
-    checkNotNull(prefix, "prefix");
-    checkNotNull(suffix, "suffix");
     this.delimiter = delimiter.toString();
     this.prefix = prefix.toString();
     this.suffix = suffix.toString();
@@ -69,7 +64,6 @@
   }
 
   public StringJoiner setEmptyValue(CharSequence emptyValue) {
-    checkNotNull(emptyValue);
     this.emptyValue = emptyValue.toString();
     return this;
   }
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java b/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
index 6321623..56812ce 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
@@ -444,6 +444,23 @@
   /**
    * Checks that bounds are correct.
    *
+   * @throws ArrayIndexOutOfBoundsException if the range is not legal
+   */
+  public static void checkCriticalArrayBounds(int start, int end, int length) {
+    if (start < 0) {
+      throw new ArrayIndexOutOfBoundsException("fromIndex: " + start + " < 0");
+    }
+    if (end > length) {
+      throw new ArrayIndexOutOfBoundsException("toIndex: " + end + " > length " + length);
+    }
+    if (start > end) {
+      throw new IllegalArgumentException("fromIndex: " + start + " > toIndex: " + end);
+    }
+  }
+
+  /**
+   * Checks that bounds are correct.
+   *
    * @throws StringIndexOutOfBoundsException if the range is not legal
    */
   public static void checkStringBounds(int start, int end, int size) {
