diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
index faec72e..4bce202 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
@@ -101,32 +101,31 @@
     assertThrows(Depset.TypeException.class, () -> get("s").getSet(Integer.class));
   }
 
-
   @Test
-  public void testToCollection() throws Exception {
+  public void testToList() throws Exception {
     exec("s = depset(['a', 'b'])");
-    assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
-    assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
-    assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
-    assertThrows(Depset.TypeException.class, () -> get("s").toCollection(Integer.class));
+    assertThat(get("s").toList(String.class)).containsExactly("a", "b").inOrder();
+    assertThat(get("s").toList(Object.class)).containsExactly("a", "b").inOrder();
+    assertThat(get("s").toList()).containsExactly("a", "b").inOrder();
+    assertThrows(Depset.TypeException.class, () -> get("s").toList(Integer.class));
   }
 
   @Test
-  public void testToCollectionDirect() throws Exception {
+  public void testToListDirect() throws Exception {
     exec("s = depset(direct = ['a', 'b'])");
-    assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
-    assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
-    assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
-    assertThrows(Depset.TypeException.class, () -> get("s").toCollection(Integer.class));
+    assertThat(get("s").toList(String.class)).containsExactly("a", "b").inOrder();
+    assertThat(get("s").toList(Object.class)).containsExactly("a", "b").inOrder();
+    assertThat(get("s").toList()).containsExactly("a", "b").inOrder();
+    assertThrows(Depset.TypeException.class, () -> get("s").toList(Integer.class));
   }
 
   @Test
-  public void testToCollectionItems() throws Exception {
+  public void testToListItems() throws Exception {
     exec("s = depset(items = ['a', 'b'])");
-    assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
-    assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
-    assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
-    assertThrows(Depset.TypeException.class, () -> get("s").toCollection(Integer.class));
+    assertThat(get("s").toList(String.class)).containsExactly("a", "b").inOrder();
+    assertThat(get("s").toList(Object.class)).containsExactly("a", "b").inOrder();
+    assertThat(get("s").toList()).containsExactly("a", "b").inOrder();
+    assertThrows(Depset.TypeException.class, () -> get("s").toList(Integer.class));
   }
 
   @Test
@@ -297,9 +296,7 @@
 
   private void assertContainsInOrder(String statement, Object... expectedElements)
       throws Exception {
-    assertThat(((Depset) eval(statement)).toCollection())
-        .containsExactly(expectedElements)
-        .inOrder();
+    assertThat(((Depset) eval(statement)).toList()).containsExactly(expectedElements).inOrder();
   }
 
   @Test
@@ -322,7 +319,7 @@
   }
 
   @Test
-  public void testToList() throws Exception {
+  public void testToListForStarlark() throws Exception {
     setSemantics();
     exec("s = depset([3, 4, 5], transitive = [depset([2, 4, 6])])", "x = s.to_list()");
     Object value = lookup("x");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
index 8b7ed2e..e5f06e8 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
@@ -611,7 +611,7 @@
             getConfiguredTarget("//a:bar")
                 .get(JavaInfo.PROVIDER)
                 .getTransitiveExports()
-                .toCollection(Label.class))
+                .toList(Label.class))
         .containsExactly(
             Label.parseAbsolute("//a:foo", ImmutableMap.of()),
             Label.parseAbsolute("//java:baz", ImmutableMap.of()));
@@ -622,7 +622,7 @@
     Collection<Artifact> compilationClasspath =
         JavaInfo.getProvider(JavaCompilationInfoProvider.class, getConfiguredTarget("//a:library"))
             .getCompilationClasspath()
-            .toCollection(Artifact.class);
+            .toList(Artifact.class);
 
     assertThat(
             compilationClasspath.stream()
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
index 9b18bfd..6945560 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -2262,11 +2262,11 @@
     ImmutableList<Artifact> bClasspath =
         JavaInfo.getProvider(JavaCompilationInfoProvider.class, bTarget)
             .getCompilationClasspath()
-            .toCollection(Artifact.class);
+            .toList(Artifact.class);
     ImmutableList<Artifact> cClasspath =
         JavaInfo.getProvider(JavaCompilationInfoProvider.class, cTarget)
             .getCompilationClasspath()
-            .toCollection(Artifact.class);
+            .toList(Artifact.class);
 
     assertThat(bClasspath).isEmpty();
     assertThat(cClasspath)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
index 7fe282b..f1c9353 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
@@ -1307,19 +1307,19 @@
 
     Depset librariesToLink = info.getValue("libraries_to_link", Depset.class);
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getStaticLibrary() != null)
                 .map(x -> x.getStaticLibrary().getFilename())
                 .collect(ImmutableList.toImmutableList()))
         .containsExactly("a.a", "b.a", "c.a", "d.a");
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getPicStaticLibrary() != null)
                 .map(x -> x.getPicStaticLibrary().getFilename())
                 .collect(ImmutableList.toImmutableList()))
         .containsExactly("a.pic.a", "libdep2.a", "b.pic.a", "c.pic.a", "e.pic.a", "libdep1.a");
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getDynamicLibrary() != null)
                 .map(x -> x.getDynamicLibrary().getFilename())
                 .collect(ImmutableList.toImmutableList()))
@@ -1351,13 +1351,13 @@
     StructImpl info = ((StructImpl) getMyInfoFromTarget(a).getValue("info"));
     Depset librariesToLink = info.getValue("libraries_to_link", Depset.class);
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getDynamicLibrary() != null)
                 .map(x -> getSolibRelativePath(x.getDynamicLibrary(), toolchain))
                 .collect(ImmutableList.toImmutableList()))
         .containsExactly("_U_S_Sfoo_Ca___Ufoo/a.so");
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getInterfaceLibrary() != null)
                 .map(x -> getSolibRelativePath(x.getInterfaceLibrary(), toolchain))
                 .collect(ImmutableList.toImmutableList()))
@@ -1387,7 +1387,7 @@
     StructImpl info = ((StructImpl) getMyInfoFromTarget(a).getValue("info"));
     Depset librariesToLink = info.getValue("libraries_to_link", Depset.class);
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getDynamicLibrary() != null)
                 .map(
                     x ->
@@ -1398,7 +1398,7 @@
                 .collect(ImmutableList.toImmutableList()))
         .containsExactly("custom/libcustom.so");
     assertThat(
-            librariesToLink.toCollection(LibraryToLink.class).stream()
+            librariesToLink.toList(LibraryToLink.class).stream()
                 .filter(x -> x.getInterfaceLibrary() != null)
                 .map(
                     x ->
@@ -1433,12 +1433,12 @@
         .containsExactly("-la", "-lc2", "-DEP2_LINKOPT", "-lc1", "-lc2", "-DEP1_LINKOPT");
     Depset additionalInputs = info.getValue("additional_inputs", Depset.class);
     assertThat(
-            additionalInputs.toCollection(Artifact.class).stream()
+            additionalInputs.toList(Artifact.class).stream()
                 .map(x -> x.getFilename())
                 .collect(ImmutableList.toImmutableList()))
         .containsExactly("b.lds", "d.lds");
     Collection<LibraryToLink> librariesToLink =
-        info.getValue("libraries_to_link", Depset.class).toCollection(LibraryToLink.class);
+        info.getValue("libraries_to_link", Depset.class).toList(LibraryToLink.class);
     assertThat(
             librariesToLink.stream()
                 .filter(x -> x.getStaticLibrary() != null)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index d7bf041..2cddf14 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -322,13 +322,12 @@
     Sequence<Artifact> sourceJars = ((Sequence<Artifact>) info.getValue("source_jars"));
     JavaRuleOutputJarsProvider outputs = ((JavaRuleOutputJarsProvider) info.getValue("outputs"));
 
-    assertThat(artifactFilesNames(transitiveRuntimeJars.toCollection(Artifact.class)))
+    assertThat(artifactFilesNames(transitiveRuntimeJars.toList(Artifact.class)))
         .containsExactly("libdep.jar");
-    assertThat(artifactFilesNames(transitiveCompileTimeJars.toCollection(Artifact.class)))
+    assertThat(artifactFilesNames(transitiveCompileTimeJars.toList(Artifact.class)))
         .containsExactly("libdep-hjar.jar");
-    assertThat(transitiveCompileTimeJars.toCollection())
-        .containsExactlyElementsIn(compileJars.toCollection());
-    assertThat(artifactFilesNames(fullCompileJars.toCollection(Artifact.class)))
+    assertThat(transitiveCompileTimeJars.toList()).containsExactlyElementsIn(compileJars.toList());
+    assertThat(artifactFilesNames(fullCompileJars.toList(Artifact.class)))
         .containsExactly("libdep.jar");
     assertThat(artifactFilesNames(sourceJars)).containsExactly("libdep-src.jar");
 
@@ -526,12 +525,10 @@
     JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
     JavaCompilationInfoProvider compilationInfo = info.getCompilationInfoProvider();
     assertThat(
-            prettyArtifactNames(
-                compilationInfo.getCompilationClasspath().toCollection(Artifact.class)))
+            prettyArtifactNames(compilationInfo.getCompilationClasspath().toList(Artifact.class)))
         .containsExactly("java/test/libdep-hjar.jar");
 
-    assertThat(
-            prettyArtifactNames(compilationInfo.getRuntimeClasspath().toCollection(Artifact.class)))
+    assertThat(prettyArtifactNames(compilationInfo.getRuntimeClasspath().toList(Artifact.class)))
         .containsExactly("java/test/libdep.jar", "java/test/libcustom.jar");
 
     assertThat(compilationInfo.getJavacOpts()).contains("-XDone");
@@ -1069,16 +1066,16 @@
         .containsExactly("com.google.process.stuff");
     assertThat(
             Iterables.transform(
-                ((Depset) info.getValue("processor_classpath")).toCollection(),
-                o -> ((Artifact) o).getFilename()))
+                ((Depset) info.getValue("processor_classpath")).toList(Artifact.class),
+                Artifact::getFilename))
         .containsExactly("libplugin.jar", "libplugin_dep.jar");
-    assertThat(((Depset) info.getValue("transitive_class_jars")).toCollection())
+    assertThat(((Depset) info.getValue("transitive_class_jars")).toList())
         .hasSize(3); // from to_be_processed, dep, and export
-    assertThat(((Depset) info.getValue("transitive_class_jars")).toCollection())
+    assertThat(((Depset) info.getValue("transitive_class_jars")).toList())
         .contains(info.getValue("class_jar"));
-    assertThat(((Depset) info.getValue("transitive_source_jars")).toCollection())
+    assertThat(((Depset) info.getValue("transitive_source_jars")).toList())
         .hasSize(3); // from to_be_processed, dep, and export
-    assertThat(((Depset) info.getValue("transitive_source_jars")).toCollection())
+    assertThat(((Depset) info.getValue("transitive_source_jars")).toList())
         .contains(info.getValue("source_jar"));
   }
 
@@ -2011,11 +2008,11 @@
 
     ConfiguredTarget configuredTarget = getConfiguredTarget("//foo:a");
     JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
-    assertThat(artifactFilesNames(info.getTransitiveRuntimeJars().toCollection(Artifact.class)))
+    assertThat(artifactFilesNames(info.getTransitiveRuntimeJars().toList(Artifact.class)))
         .containsExactly("liba.jar");
     assertThat(artifactFilesNames(info.getTransitiveSourceJars().getSet(Artifact.class)))
         .containsExactly("liba-src.jar", "libb-src.jar");
-    assertThat(artifactFilesNames(info.getTransitiveCompileTimeJars().toCollection(Artifact.class)))
+    assertThat(artifactFilesNames(info.getTransitiveCompileTimeJars().toList(Artifact.class)))
         .containsExactly("liba-hjar.jar", "libb-hjar.jar");
   }
 
@@ -2055,9 +2052,9 @@
 
     ConfiguredTarget configuredTarget = getConfiguredTarget("//foo:c");
     JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
-    assertThat(artifactFilesNames(info.getTransitiveRuntimeJars().toCollection(Artifact.class)))
+    assertThat(artifactFilesNames(info.getTransitiveRuntimeJars().toList(Artifact.class)))
         .containsExactly("libb.jar");
-    assertThat(artifactFilesNames(info.getTransitiveCompileTimeJars().toCollection(Artifact.class)))
+    assertThat(artifactFilesNames(info.getTransitiveCompileTimeJars().toList(Artifact.class)))
         .containsExactly("libb-hjar.jar");
     JavaRuleOutputJarsProvider outputs = info.getOutputJars();
     assertThat(outputs.getOutputJars()).hasSize(1);
@@ -2277,6 +2274,6 @@
         "--javabase=//a:jvm", "--extra_toolchains=//a:all", "--platforms=//a:platform");
     ConfiguredTarget ct = getConfiguredTarget("//a:r");
     Depset files = (Depset) ct.get("files");
-    assertThat(prettyArtifactNames(files.toCollection(Artifact.class))).containsExactly("a/a.txt");
+    assertThat(prettyArtifactNames(files.toList(Artifact.class))).containsExactly("a/a.txt");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 0f7754e..a29e79e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -1841,7 +1841,7 @@
         "deps", "['//testlib:lib']");
 
     ObjcProvider objcProvider = providerForTarget("//x:x");
-    assertThat(objcProvider.sdkFramework().toCollection()).contains("TestFramework");
+    assertThat(objcProvider.sdkFramework().toList()).contains("TestFramework");
   }
 
   protected RuleType getRuleType() {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
index 7146c20..33dcc78 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
@@ -1400,7 +1400,7 @@
         ")");
     ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
     Depset emptyValue = (Depset) getMyInfoFromTarget(skylarkTarget).getValue("empty_value");
-    assertThat(emptyValue.toCollection()).isEmpty();
+    assertThat(emptyValue.toList()).isEmpty();
   }
 
   @Test
@@ -1437,7 +1437,7 @@
     ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
     Depset sdkFrameworks = (Depset) getMyInfoFromTarget(skylarkTarget).getValue("sdk_frameworks");
-    assertThat(sdkFrameworks.toCollection()).containsAtLeast("Accelerate", "GLKit");
+    assertThat(sdkFrameworks.toList()).containsAtLeast("Accelerate", "GLKit");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PythonStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PythonStarlarkApiTest.java
index b14875b..97bffef 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PythonStarlarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PythonStarlarkApiTest.java
@@ -140,13 +140,13 @@
     }
 
     PyInfo modernInfo = PyProviderUtils.getModernProvider(target);
-    assertThat(modernInfo.getTransitiveSources().toCollection(Artifact.class))
+    assertThat(modernInfo.getTransitiveSources().toList(Artifact.class))
         .containsExactly(
             getSourceArtifact("pkg/loweruserlib.py"),
             getSourceArtifact("pkg/pylib.py"),
             getSourceArtifact("pkg/upperuserlib.py"));
     assertThat(modernInfo.getUsesSharedLibraries()).isTrue();
-    assertThat(modernInfo.getImports().toCollection(String.class))
+    assertThat(modernInfo.getImports().toList(String.class))
         .containsExactly("loweruserlib_path", "upperuserlib_path");
     assertThat(modernInfo.getHasPy2OnlySources()).isTrue();
     assertThat(modernInfo.getHasPy3OnlySources()).isTrue();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkDefinedAspectsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkDefinedAspectsTest.java
index da211cb..c852456 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkDefinedAspectsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkDefinedAspectsTest.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylark;
 
-import static com.google.common.collect.Iterables.transform;
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.analysis.OutputGroupInfo.INTERNAL_SUFFIX;
@@ -175,7 +174,7 @@
   }
 
   private Iterable<String> getAspectDescriptions(AnalysisResult analysisResult) {
-    return transform(
+    return Iterables.transform(
         analysisResult.getAspectsMap().keySet(),
         aspectKey ->
             String.format("%s(%s)", aspectKey.getAspectClass().getName(), aspectKey.getLabel()));
@@ -223,7 +222,7 @@
   }
 
   private Iterable<String> getLabelsToBuild(AnalysisResult analysisResult) {
-    return transform(
+    return Iterables.transform(
         analysisResult.getTargetsToBuild(),
         configuredTarget -> configuredTarget.getLabel().toString());
   }
@@ -299,8 +298,8 @@
     Object names = configuredAspect.get("target_labels");
     assertThat(names).isInstanceOf(Depset.class);
     assertThat(
-            transform(
-                ((Depset) names).toCollection(),
+            Iterables.transform(
+                ((Depset) names).toList(),
                 o -> {
                   assertThat(o).isInstanceOf(Label.class);
                   return o.toString();
@@ -308,7 +307,7 @@
         .containsExactly("//test:xxx", "//test:yyy");
     Object ruleKinds = configuredAspect.get("rule_kinds");
     assertThat(ruleKinds).isInstanceOf(Depset.class);
-    assertThat(((Depset) ruleKinds).toCollection()).containsExactly("java_library");
+    assertThat(((Depset) ruleKinds).toList()).containsExactly("java_library");
   }
 
   @Test
@@ -355,8 +354,8 @@
     Object nameSet = configuredAspect.get("target_labels");
     ImmutableList<String> names =
         ImmutableList.copyOf(
-            transform(
-                ((Depset) nameSet).toCollection(),
+            Iterables.transform(
+                ((Depset) nameSet).toList(),
                 o -> {
                   assertThat(o).isInstanceOf(Label.class);
                   return ((Label) o).getName();
@@ -453,7 +452,7 @@
     AnalysisResult analysisResult =
         update(ImmutableList.of("test/aspect.bzl%MyAspect"), "//test:xxx");
     assertThat(
-            transform(
+            Iterables.transform(
                 analysisResult.getTargetsToBuild(),
                 configuredTarget -> configuredTarget.getLabel().toString()))
         .containsExactly("//test:xxx");
@@ -507,8 +506,8 @@
     Object names = target.get("rule_deps");
     assertThat(names).isInstanceOf(Depset.class);
     assertThat(
-            transform(
-                ((Depset) names).toCollection(),
+            Iterables.transform(
+                ((Depset) names).toList(),
                 o -> {
                   assertThat(o).isInstanceOf(Label.class);
                   return o.toString();
@@ -1625,7 +1624,7 @@
     AnalysisResult analysisResult = update(ImmutableList.<String>of(), "//foo:main");
     ConfiguredTarget target = analysisResult.getTargetsToBuild().iterator().next();
     NestedSet<Artifact> aspectFiles = ((Depset) target.get("aspect_files")).getSet(Artifact.class);
-    assertThat(transform(aspectFiles.toList(), Artifact::getFilename))
+    assertThat(Iterables.transform(aspectFiles.toList(), Artifact::getFilename))
         .containsExactly("aspect-output-rbin", "aspect-output-rgen");
     for (Artifact aspectFile : aspectFiles.toList()) {
       String rootPath = aspectFile.getRoot().getExecPath().toString();
@@ -1811,8 +1810,8 @@
     Object names = configuredAspect.get("target_labels");
     assertThat(names).isInstanceOf(Depset.class);
     assertThat(
-            transform(
-                ((Depset) names).toCollection(),
+            Iterables.transform(
+                ((Depset) names).toList(),
                 o -> {
                   assertThat(o).isInstanceOf(Label.class);
                   return ((Label) o).getName();
@@ -2496,7 +2495,7 @@
         new StarlarkProvider.Key(
             Label.parseAbsolute("//test:aspect.bzl", ImmutableMap.of()), "PCollector");
     StructImpl collector = (StructImpl) configuredAspect.get(pCollector);
-    assertThat(((Depset) collector.getValue("visited")).toCollection())
+    assertThat(((Depset) collector.getValue("visited")).toList())
         .containsExactly(
             Label.parseAbsolute("//test:referenced_from_aspect_only", ImmutableMap.of()),
             Label.parseAbsolute("//test:bar", ImmutableMap.of()),
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index e9a7691..db7a8da 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -65,7 +65,6 @@
 import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.FileTypeSet;
-import java.util.Collection;
 import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Rule;
@@ -1310,11 +1309,11 @@
   }
 
   @Test
-  public void testNsetGoodCompositeItem() throws Exception {
+  public void testDepsetGoodCompositeItem() throws Exception {
     exec("def func():", "  return depset([struct(a='a')])", "s = func()");
-    Collection<?> result = ((Depset) lookup("s")).toCollection();
+    ImmutableList<?> result = ((Depset) lookup("s")).toList();
     assertThat(result).hasSize(1);
-    assertThat(result.iterator().next()).isInstanceOf(StructImpl.class);
+    assertThat(result.get(0)).isInstanceOf(StructImpl.class);
   }
 
   private static StructImpl makeStruct(String field, Object value) {
