diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java
index 2dbb468..c0ab5dd 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.util.Pair;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -411,14 +411,14 @@
    * that requires any of providers {@code requiredAspects}.
    */
   private Aspect createAspect(final String className, String... requiredAspects) {
-    ImmutableList.Builder<ImmutableSet<SkylarkProviderIdentifier>> requiredProvidersBuilder =
+    ImmutableList.Builder<ImmutableSet<StarlarkProviderIdentifier>> requiredProvidersBuilder =
         ImmutableList.builder();
 
     for (String requiredAspect : requiredAspects) {
       requiredProvidersBuilder.add(
-          ImmutableSet.of((SkylarkProviderIdentifier.forLegacy(requiredAspect))));
+          ImmutableSet.of((StarlarkProviderIdentifier.forLegacy(requiredAspect))));
     }
-    final ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> requiredProviders =
+    final ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> requiredProviders =
         requiredProvidersBuilder.build();
     return Aspect.forNative(
         new NativeAspectClass() {
@@ -431,11 +431,11 @@
           public AspectDefinition getDefinition(AspectParameters aspectParameters) {
             return AspectDefinition.builder(this)
                 .requireAspectsWithProviders(requiredProviders)
-                .advertiseProvider(ImmutableList.of(SkylarkProviderIdentifier.forLegacy(className)))
+                .advertiseProvider(
+                    ImmutableList.of(StarlarkProviderIdentifier.forLegacy(className)))
                 .build();
           }
-        }
-    );
+        });
   }
 
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index b3454f7..e4f25da 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -49,7 +49,7 @@
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
@@ -570,10 +570,10 @@
       = new FalseAdvertisementAspect();
   private static final AspectDefinition FALSE_ADVERTISEMENT_DEFINITION =
       new AspectDefinition.Builder(FALSE_ADVERTISEMENT_ASPECT)
-        .advertiseProvider(RequiredProvider.class)
-        .advertiseProvider(
-            ImmutableList.of(SkylarkProviderIdentifier.forLegacy("advertised_provider")))
-        .build();
+          .advertiseProvider(RequiredProvider.class)
+          .advertiseProvider(
+              ImmutableList.of(StarlarkProviderIdentifier.forLegacy("advertised_provider")))
+          .build();
 
   /**
    * A common base rule for mock rules in this class to reduce boilerplate.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java
index 0334665..a3021b4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java
@@ -114,15 +114,15 @@
         getPackageManager()
             .getPackage(NullEventHandler.INSTANCE, PackageIdentifier.createInMainRepo("foo"));
 
-    ImmutableList.Builder<ImmutableList<SkylarkProviderIdentifier>> allListsBuilder =
+    ImmutableList.Builder<ImmutableList<StarlarkProviderIdentifier>> allListsBuilder =
         ImmutableList.builder();
     for (Rule ruleInstance : fooPkg.getTargets(Rule.class)) {
       RuleClass ruleClass = ruleInstance.getRuleClassObject();
       allListsBuilder.add(ruleClass.getAdvertisedProviders().getSkylarkProviders().asList());
     }
-    ImmutableList<ImmutableList<SkylarkProviderIdentifier>> allLists = allListsBuilder.build();
+    ImmutableList<ImmutableList<StarlarkProviderIdentifier>> allLists = allListsBuilder.build();
     assertThat(allLists).hasSize(2);
-    ImmutableList<SkylarkProviderIdentifier> firstList = allLists.get(0);
+    ImmutableList<StarlarkProviderIdentifier> firstList = allLists.get(0);
     for (int i = 1; i < allLists.size(); i++) {
       assertThat(allLists.get(i).get(0)).isSameInstanceAs(firstList.get(0));
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
index f050c54..f1f11be 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
@@ -48,12 +48,12 @@
     }
   }
 
-  private static final SkylarkProviderIdentifier ID_NATIVE =
-      SkylarkProviderIdentifier.forKey(P_NATIVE.getKey());
-  private static final SkylarkProviderIdentifier ID_SKYLARK =
-      SkylarkProviderIdentifier.forKey(P_SKYLARK.getKey());
-  private static final SkylarkProviderIdentifier ID_LEGACY =
-      SkylarkProviderIdentifier.forLegacy("p_legacy");
+  private static final StarlarkProviderIdentifier ID_NATIVE =
+      StarlarkProviderIdentifier.forKey(P_NATIVE.getKey());
+  private static final StarlarkProviderIdentifier ID_SKYLARK =
+      StarlarkProviderIdentifier.forKey(P_SKYLARK.getKey());
+  private static final StarlarkProviderIdentifier ID_LEGACY =
+      StarlarkProviderIdentifier.forLegacy("p_legacy");
 
   private static boolean satisfies(AdvertisedProviderSet providers,
       RequiredProviders requiredProviders) {
@@ -212,10 +212,10 @@
   private static boolean validateSkylark(
       AdvertisedProviderSet providerSet,
       String missing,
-      ImmutableSet<SkylarkProviderIdentifier>... sets) {
+      ImmutableSet<StarlarkProviderIdentifier>... sets) {
     RequiredProviders.Builder anyBuilder = RequiredProviders.acceptAnyBuilder();
     RequiredProviders.Builder noneBuilder = RequiredProviders.acceptNoneBuilder();
-    for (ImmutableSet<SkylarkProviderIdentifier> set : sets) {
+    for (ImmutableSet<StarlarkProviderIdentifier> set : sets) {
       anyBuilder.addSkylarkSet(set);
       noneBuilder.addSkylarkSet(set);
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 6da021a..4e4c25c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -20,7 +20,7 @@
 import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.BuildType.OUTPUT_LIST;
 import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.substitutePlaceholderIntoTemplate;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 import static com.google.devtools.build.lib.packages.RuleClass.NO_EXTERNAL_BINDINGS;
 import static com.google.devtools.build.lib.packages.Type.BOOLEAN;
 import static com.google.devtools.build.lib.packages.Type.INTEGER;
@@ -1190,8 +1190,8 @@
             .setBuildSetting(new BuildSetting(false, STRING))
             .build();
 
-    assertThat(labelFlag.hasAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isTrue();
-    assertThat(stringSetting.hasAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, STRING)).isTrue();
+    assertThat(labelFlag.hasAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isTrue();
+    assertThat(stringSetting.hasAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, STRING)).isTrue();
   }
 
   @Test
@@ -1202,7 +1202,7 @@
             .add(attr("tags", STRING_LIST))
             .build();
 
-    assertThat(stringSetting.hasAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isFalse();
+    assertThat(stringSetting.hasAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
index 58464d6..e69dd60 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
@@ -36,7 +36,7 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig;
 import com.google.devtools.build.lib.packages.util.MockCcSupport;
@@ -5832,7 +5832,7 @@
                 .getLibraries()
                 .toList());
     SkylarkInfo fooInfo =
-        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(SkylarkProviderIdentifier.forKey(key));
+        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(StarlarkProviderIdentifier.forKey(key));
 
     assertThat(fooLibrary.getObjectFiles()).isEqualTo(fooInfo.getValue("objects"));
     assertThat(fooLibrary.getPicObjectFiles()).isEqualTo(fooInfo.getValue("pic_objects"));
@@ -5848,7 +5848,7 @@
 
     // Default toolchain is without PIC support, so pic_objects should be None
     SkylarkInfo fooInfoForPic =
-        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(SkylarkProviderIdentifier.forKey(key));
+        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(StarlarkProviderIdentifier.forKey(key));
 
     Object picObjects = fooInfoForPic.getValue("pic_objects");
     assertThat(picObjects).isNotEqualTo(Starlark.NONE);
@@ -5864,7 +5864,7 @@
                 .withFeatures(CppRuleClasses.SUPPORTS_PIC, CppRuleClasses.PIC));
     invalidatePackages();
     SkylarkInfo fooInfoForNoPic =
-        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(SkylarkProviderIdentifier.forKey(key));
+        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(StarlarkProviderIdentifier.forKey(key));
 
     Object objects = fooInfoForNoPic.getValue("objects");
     assertThat(objects).isNotEqualTo(Starlark.NONE);
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 8a59f59..e71988c 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
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.packages.SkylarkDefinedAspect;
 import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
 import com.google.devtools.build.lib.packages.Type;
@@ -295,12 +295,12 @@
     assertThat(attr.isSingleArtifact()).isTrue();
   }
 
-  private static SkylarkProviderIdentifier legacy(String legacyId) {
-    return SkylarkProviderIdentifier.forLegacy(legacyId);
+  private static StarlarkProviderIdentifier legacy(String legacyId) {
+    return StarlarkProviderIdentifier.forLegacy(legacyId);
   }
 
-  private static SkylarkProviderIdentifier declared(String exportedName) {
-    return SkylarkProviderIdentifier.forKey(
+  private static StarlarkProviderIdentifier declared(String exportedName) {
+    return StarlarkProviderIdentifier.forKey(
         new SkylarkProvider.SkylarkKey(FAKE_LABEL, exportedName));
   }
 
@@ -335,9 +335,9 @@
     assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("a")))).isFalse();
   }
 
-  private static AdvertisedProviderSet set(SkylarkProviderIdentifier... ids) {
+  private static AdvertisedProviderSet set(StarlarkProviderIdentifier... ids) {
     AdvertisedProviderSet.Builder builder = AdvertisedProviderSet.builder();
-    for (SkylarkProviderIdentifier id : ids) {
+    for (StarlarkProviderIdentifier id : ids) {
       builder.addSkylark(id);
     }
     return builder.build();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index cd70a28..a8dad58 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
 import com.google.devtools.build.lib.packages.SkylarkProvider.SkylarkKey;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
@@ -89,10 +89,10 @@
                               .legacyAllowAnyFileType()
                               .mandatoryProvidersList(
                                   ImmutableList.of(
-                                      ImmutableList.of(SkylarkProviderIdentifier.forLegacy("a")),
+                                      ImmutableList.of(StarlarkProviderIdentifier.forLegacy("a")),
                                       ImmutableList.of(
-                                          SkylarkProviderIdentifier.forLegacy("b"),
-                                          SkylarkProviderIdentifier.forLegacy("c"))))));
+                                          StarlarkProviderIdentifier.forLegacy("b"),
+                                          StarlarkProviderIdentifier.forLegacy("c"))))));
 
   @Override
   protected ConfiguredRuleClassProvider getRuleClassProvider() {
