diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index f4905df..91e5902 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -851,17 +851,21 @@
           factory.createProto(factory.intType, factory.intType, factory.intType, factory.intType);
       addProvider(new MethodGenerator(clazz, method, proto, ObjectsMethods::new));
 
-      // List of
+      // List<E> List.of(<args>) for 0 to 10 arguments
       clazz = factory.listDescriptor;
       method = factory.createString("of");
-
-      // From 0 to 10 arguments.
       ArrayList<DexType> parameters = new ArrayList<>();
       for (int i = 0; i <= 10; i++) {
         proto = factory.createProto(factory.listType, parameters);
         addProvider(new MethodGenerator(clazz, method, proto, ListMethods::new));
         parameters.add(factory.objectType);
       }
+
+      // List<E> List.of(E...)
+      clazz = factory.listDescriptor;
+      method = factory.createString("of");
+      proto = factory.createProto(factory.listType, factory.objectArrayType);
+      addProvider(new MethodGenerator(clazz, method, proto, ListMethods::new, "ofVarargs"));
     }
 
     private void initializeJava11MethodProviders(DexItemFactory factory) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java
index 87f2a62..5499367 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java
@@ -7,10 +7,12 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
 import com.android.tools.r8.utils.InternalOptions;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
+@SuppressWarnings("unchecked")
 public class ListMethods extends TemplateMethodCode {
 
   public ListMethods(InternalOptions options, DexMethod method, String methodName) {
@@ -22,46 +24,64 @@
   }
 
   public static <E> List<E> of(E e0) {
-    return Collections.singletonList(e0);
+    return Collections.singletonList(Objects.requireNonNull(e0));
   }
 
   public static <E> List<E> of(E e0, E e1) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1));
+    E[] elements = (E[]) new Object[] { e0, e1 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2));
+    E[] elements = (E[]) new Object[] { e0, e1, e2 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7, e8));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 };
+    return List.of(elements);
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
-    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10));
+    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 };
+    return List.of(elements);
+  }
+
+  public static <E> List<E> ofVarargs(E[] elements) {
+    ArrayList<E> list = new ArrayList<>(elements.length);
+    for (E element : elements) {
+      list.add(Objects.requireNonNull(element));
+    }
+    return Collections.unmodifiableList(list);
   }
 }
diff --git a/src/test/examplesJava9/backport/ListBackportJava9Main.java b/src/test/examplesJava9/backport/ListBackportJava9Main.java
index 9ad147f..4c8ae88 100644
--- a/src/test/examplesJava9/backport/ListBackportJava9Main.java
+++ b/src/test/examplesJava9/backport/ListBackportJava9Main.java
@@ -8,59 +8,163 @@
 
 public class ListBackportJava9Main {
 
-  public static void main(String[] args) throws Exception {
+  public static void main(String[] args) {
     testOf0();
     testOf1();
     testOf2();
     testOf10();
+    testOfVarargs();
   }
 
   private static void testOf0() {
     List<Object> ofObject = List.of();
+    assertEquals(0, ofObject.size());
+    assertMutationNotAllowed(ofObject);
+
     List<Integer> ofInteger = List.of();
-    assertTrue(ofObject instanceof List);
-    assertTrue(ofObject.size() == 0);
-    assertTrue(ofInteger instanceof List);
-    assertTrue(ofInteger.size() == 0);
+    assertEquals(0, ofInteger.size());
+    assertMutationNotAllowed(ofObject);
   }
 
   private static void testOf1() {
-    List<Object> ofObject = List.of(new Object());
+    Object anObject = new Object();
+    List<Object> ofObject = List.of(anObject);
+    assertEquals(1, ofObject.size());
+    assertSame(anObject, ofObject.get(0));
+    assertMutationNotAllowed(ofObject);
+
     List<Integer> ofInteger = List.of(1);
-    assertTrue(ofObject instanceof List);
-    assertTrue(ofObject.size() == 1);
-    assertTrue(ofInteger instanceof List);
-    assertTrue(ofInteger.size() == 1);
+    assertEquals(1, ofInteger.size());
+    assertEquals(1, ofInteger.get(0));
+
+    try {
+      List.of((Object) null);
+      throw new AssertionError();
+    } catch (NullPointerException expected) {
+    }
   }
 
   private static void testOf2() {
-    List<Object> ofObject = List.of(new Object(), new Object());
+    Object anObject0 = new Object();
+    Object anObject1 = new Object();
+    List<Object> ofObject = List.of(anObject0, anObject1);
+    assertEquals(2, ofObject.size());
+    assertSame(anObject0, ofObject.get(0));
+    assertSame(anObject1, ofObject.get(1));
+    assertMutationNotAllowed(ofObject);
+
     List<Integer> ofInteger = List.of(1, 2);
-    List<Object> ofMixed = List.of(new Object(), 1);
-    assertTrue(ofObject instanceof List);
-    assertTrue(ofObject.size() == 2);
-    assertTrue(ofInteger instanceof List);
-    assertTrue(ofInteger.size() == 2);
-    assertTrue(ofMixed instanceof List);
-    assertTrue(ofMixed.size() == 2);
+    assertEquals(2, ofInteger.size());
+    assertEquals(1, ofInteger.get(0));
+    assertEquals(2, ofInteger.get(1));
+
+    List<Object> ofMixed = List.of(anObject0, 1);
+    assertEquals(2, ofMixed.size());
+    assertSame(anObject0, ofMixed.get(0));
+    assertEquals(1, ofMixed.get(1));
+    assertMutationNotAllowed(ofMixed);
+
+    try {
+      List.of(1, null);
+      throw new AssertionError();
+    } catch (NullPointerException expected) {
+    }
   }
 
   private static void testOf10() {
-    Object e = new Object();
-    List<Object> ofObject = List.of(e, e, e, e, e, e, e, e, e, e);
+    Object anObject0 = new Object();
+    Object anObject6 = new Object();
+    Object anObject9 = new Object();
+    List<Object> ofObject =
+        List.of(anObject0, new Object(), new Object(), new Object(), new Object(), new Object(),
+            anObject6, new Object(), new Object(), anObject9);
+    assertEquals(10, ofObject.size());
+    assertSame(anObject0, ofObject.get(0));
+    assertSame(anObject6, ofObject.get(6));
+    assertSame(anObject9, ofObject.get(9));
+    assertMutationNotAllowed(ofObject);
+
     List<Integer> ofInteger = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
-    List<Object> ofMixed = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, e);
-    assertTrue(ofObject instanceof List);
-    assertTrue(ofObject.size() == 10);
-    assertTrue(ofInteger instanceof List);
-    assertTrue(ofInteger.size() == 10);
-    assertTrue(ofMixed instanceof List);
-    assertTrue(ofMixed.size() == 10);
+    assertEquals(10, ofInteger.size());
+    assertEquals(0, ofInteger.get(0));
+    assertEquals(6, ofInteger.get(6));
+    assertEquals(9, ofInteger.get(9));
+
+    List<Object> ofMixed = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, anObject9);
+    assertEquals(10, ofMixed.size());
+    assertEquals(0, ofMixed.get(0));
+    assertEquals(6, ofMixed.get(6));
+    assertSame(anObject9, ofMixed.get(9));
+    assertMutationNotAllowed(ofMixed);
+
+    try {
+      List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, null);
+      throw new AssertionError();
+    } catch (NullPointerException expected) {
+    }
   }
 
-  private static void assertTrue(boolean value) {
-    if (!value) {
-      throw new AssertionError("Expected <true> but was <false>");
+  private static void testOfVarargs() {
+    Object anObject0 = new Object();
+    Object anObject6 = new Object();
+    Object anObject10 = new Object();
+    List<Object> ofObject =
+        List.of(anObject0, new Object(), new Object(), new Object(), new Object(), new Object(),
+            anObject6, new Object(), new Object(), new Object(), anObject10);
+    assertEquals(11, ofObject.size());
+    assertSame(anObject0, ofObject.get(0));
+    assertSame(anObject6, ofObject.get(6));
+    assertSame(anObject10, ofObject.get(10));
+    assertMutationNotAllowed(ofObject);
+
+    List<Integer> ofInteger = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+    assertEquals(11, ofInteger.size());
+    assertEquals(0, ofInteger.get(0));
+    assertEquals(6, ofInteger.get(6));
+    assertEquals(10, ofInteger.get(10));
+
+    List<Object> ofMixed = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, anObject10);
+    assertEquals(11, ofMixed.size());
+    assertEquals(0, ofMixed.get(0));
+    assertEquals(6, ofMixed.get(6));
+    assertSame(anObject10, ofMixed.get(10));
+    assertMutationNotAllowed(ofMixed);
+
+    // Ensure the supplied mutable array is not used directly since it is mutable.
+    Object[] mutableArray = { anObject0 };
+    List<Object> ofMutableArray = List.of(mutableArray);
+    mutableArray[0] = anObject10;
+    assertSame(anObject0, ofMutableArray.get(0));
+
+    try {
+      List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, null);
+      throw new AssertionError();
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  private static void assertMutationNotAllowed(List<Object> ofObject) {
+    try {
+      ofObject.add(new Object());
+      throw new AssertionError();
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      ofObject.set(0, new Object());
+      throw new AssertionError();
+    } catch (UnsupportedOperationException expected) {
+    }
+  }
+
+  private static void assertSame(Object expected, Object actual) {
+    if (expected != actual) {
+      throw new AssertionError("Expected <" + expected + "> but was <" + actual + ">");
+    }
+  }
+
+  private static void assertEquals(Object expected, Object actual) {
+    if (expected != actual && !expected.equals(actual)) {
+      throw new AssertionError("Expected <" + expected + "> but was <" + actual + ">");
     }
   }
 }
