diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java
index fc74dab..f1f1ee6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
-import com.google.devtools.build.lib.packages.SkylarkInfo;
+import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.skylarkbuildapi.ActionsInfoProviderApi;
 import com.google.devtools.build.lib.syntax.Location;
@@ -51,6 +51,6 @@
     }
     ImmutableMap<String, Object> fields =
         ImmutableMap.<String, Object>of("by_file", Starlark.fromJava(map, /*mutability=*/ null));
-    return SkylarkInfo.create(INSTANCE, fields, Location.BUILTIN);
+    return StarlarkInfo.create(INSTANCE, fields, Location.BUILTIN);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index 0bf2ebd..e3e8b02 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -247,13 +247,13 @@
         "extra/ExtraAction.java",
         "extra/ExtraActionMapProvider.java",
         "extra/ExtraActionSpec.java",
-        "skylark/SkylarkRuleConfiguredTargetUtil.java",
         "skylark/StarlarkActionFactory.java",
         "skylark/StarlarkAttrModule.java",
         "skylark/StarlarkAttributeTransitionProvider.java",
         "skylark/StarlarkAttributesCollection.java",
         "skylark/StarlarkModules.java",
         "skylark/StarlarkRuleClassFunctions.java",
+        "skylark/StarlarkRuleConfiguredTargetUtil.java",
         "skylark/StarlarkRuleContext.java",
         "skylark/StarlarkRuleTransitionProvider.java",
         "skylark/StarlarkTransition.java",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 798e510..a753921 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.OutputFileConfiguredTarget;
 import com.google.devtools.build.lib.analysis.configuredtargets.PackageGroupConfiguredTarget;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
-import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleConfiguredTargetUtil;
+import com.google.devtools.build.lib.analysis.skylark.StarlarkRuleConfiguredTargetUtil;
 import com.google.devtools.build.lib.analysis.test.AnalysisFailure;
 import com.google.devtools.build.lib.analysis.test.AnalysisFailureInfo;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -465,7 +465,7 @@
       if (rule.getRuleClassObject().isStarlark()) {
         // TODO(bazel-team): maybe merge with RuleConfiguredTargetBuilder?
         ConfiguredTarget target =
-            SkylarkRuleConfiguredTargetUtil.buildRule(
+            StarlarkRuleConfiguredTargetUtil.buildRule(
                 ruleContext,
                 rule.getRuleClassObject().getAdvertisedProviders(),
                 rule.getRuleClassObject().getConfiguredTargetFunction(),
@@ -707,7 +707,7 @@
       }
     }
 
-    for (StarlarkProviderIdentifier providerId : advertisedProviders.getSkylarkProviders()) {
+    for (StarlarkProviderIdentifier providerId : advertisedProviders.getStarlarkProviders()) {
       if (configuredAspect.get(providerId) == null) {
         eventHandler.handle(
             Event.error(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
index 30cfd0e..dba6a64 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleConfiguredTargetUtil;
+import com.google.devtools.build.lib.analysis.skylark.StarlarkRuleConfiguredTargetUtil;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -287,7 +287,7 @@
           Dict.cast(kwargs, String.class, Object.class, "kwargs").entrySet()) {
         builder.put(
             entry.getKey(),
-            SkylarkRuleConfiguredTargetUtil.convertToOutputGroupValue(
+            StarlarkRuleConfiguredTargetUtil.convertToOutputGroupValue(
                 entry.getKey(), entry.getValue()));
       }
       return new OutputGroupInfo(builder.build());
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 3d827cc..658e0a8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -463,7 +463,7 @@
    * Integer, an Artifact, a Label, None, a Java TransitiveInfoProvider or something composed from
    * these in Starlark using lists, sets, structs or dicts). Otherwise an EvalException is thrown.
    */
-  public RuleConfiguredTargetBuilder addSkylarkTransitiveInfo(
+  public RuleConfiguredTargetBuilder addStarlarkTransitiveInfo(
       String name, Object value, Location loc) throws EvalException {
     providersBuilder.put(name, value);
     return this;
@@ -473,12 +473,12 @@
    * Adds a "declared provider" defined in Starlark to the rule. Use this method for declared
    * providers defined in Skyark.
    *
-   * <p>Has special handling for {@link OutputGroupInfo}: that provider is not added from Skylark
+   * <p>Has special handling for {@link OutputGroupInfo}: that provider is not added from Starlark
    * directly, instead its output groups are added.
    *
    * <p>Use {@link #addNativeDeclaredProvider(Info)} in definitions of native rules.
    */
-  public RuleConfiguredTargetBuilder addSkylarkDeclaredProvider(Info provider)
+  public RuleConfiguredTargetBuilder addStarlarkDeclaredProvider(Info provider)
       throws EvalException {
     Provider constructor = provider.getProvider();
     if (!constructor.isExported()) {
@@ -500,7 +500,7 @@
    * Adds "declared providers" defined in native code to the rule. Use this method for declared
    * providers in definitions of native rules.
    *
-   * <p>Use {@link #addSkylarkDeclaredProvider(Info)} for Starlark rule implementations.
+   * <p>Use {@link #addStarlarkDeclaredProvider(Info)} for Starlark rule implementations.
    */
   public RuleConfiguredTargetBuilder addNativeDeclaredProviders(Iterable<Info> providers) {
     for (Info provider : providers) {
@@ -513,7 +513,7 @@
    * Adds a "declared provider" defined in native code to the rule. Use this method for declared
    * providers in definitions of native rules.
    *
-   * <p>Use {@link #addSkylarkDeclaredProvider(Info)} for Starlark rule implementations.
+   * <p>Use {@link #addStarlarkDeclaredProvider(Info)} for Starlark rule implementations.
    */
   public RuleConfiguredTargetBuilder addNativeDeclaredProvider(Info provider) {
     Provider constructor = provider.getProvider();
@@ -539,7 +539,7 @@
   }
 
   /** Add a Starlark transitive info. The provider value must be safe. */
-  public RuleConfiguredTargetBuilder addSkylarkTransitiveInfo(String name, Object value) {
+  public RuleConfiguredTargetBuilder addStarlarkTransitiveInfo(String name, Object value) {
     providersBuilder.put(name, value);
     return this;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
index 6e31137..e783500 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
@@ -78,7 +78,7 @@
   private static ImmutableSortedMap<String, Object> copyValues(Map<String, Object> values) {
     ImmutableSortedMap.Builder<String, Object> builder = ImmutableSortedMap.naturalOrder();
     for (Map.Entry<String, Object> e : values.entrySet()) {
-      builder.put(Attribute.getSkylarkName(e.getKey()), Starlark.fromJava(e.getValue(), null));
+      builder.put(Attribute.getStarlarkName(e.getKey()), Starlark.fromJava(e.getValue(), null));
     }
     return builder.build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java
index 19e877f..03ceb85 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkAttributeTransitionProvider.java
@@ -93,7 +93,7 @@
       LinkedHashMap<String, Object> attributes = new LinkedHashMap<>();
       for (String attribute : attributeMap.getAttributeNames()) {
         Object val = attributeMap.get(attribute, attributeMap.getAttributeType(attribute));
-        attributes.put(Attribute.getSkylarkName(attribute), Starlark.fromJava(val, null));
+        attributes.put(Attribute.getStarlarkName(attribute), Starlark.fromJava(val, null));
       }
       attrObject = StructProvider.STRUCT.create(attributes, ERROR_MESSAGE_FOR_NO_ATTR);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleConfiguredTargetUtil.java
similarity index 96%
rename from src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
rename to src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleConfiguredTargetUtil.java
index 2dc9a76..61fa131 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleConfiguredTargetUtil.java
@@ -41,11 +41,12 @@
 import com.google.devtools.build.lib.packages.FunctionSplitTransitionWhitelist;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.NativeProvider;
+import com.google.devtools.build.lib.packages.NativeProvider.WithLegacyStarlarkName;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.packages.SkylarkInfo;
+import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
@@ -73,9 +74,9 @@
  * A helper class to build Rule Configured Targets via runtime loaded rule implementations defined
  * using the Starlark Build Extension Language.
  */
-public final class SkylarkRuleConfiguredTargetUtil {
+public final class StarlarkRuleConfiguredTargetUtil {
 
-  private SkylarkRuleConfiguredTargetUtil() {}
+  private StarlarkRuleConfiguredTargetUtil() {}
 
   private static final ImmutableSet<String> DEFAULT_PROVIDER_FIELDS =
       ImmutableSet.of("files", "runfiles", "data_runfiles", "default_runfiles", "executable");
@@ -179,7 +180,7 @@
   private static void checkDeclaredProviders(
       ConfiguredTarget configuredTarget, AdvertisedProviderSet advertisedProviders, Location loc)
       throws EvalException {
-    for (StarlarkProviderIdentifier providerId : advertisedProviders.getSkylarkProviders()) {
+    for (StarlarkProviderIdentifier providerId : advertisedProviders.getStarlarkProviders()) {
       if (configuredTarget.get(providerId) == null) {
         throw new EvalException(
             loc,
@@ -309,7 +310,7 @@
       throws EvalException {
 
     StructImpl oldStyleProviders =
-        SkylarkInfo.create(StructProvider.STRUCT, ImmutableMap.of(), loc);
+        StarlarkInfo.create(StructProvider.STRUCT, ImmutableMap.of(), loc);
     Map<Provider.Key, Info> declaredProviders = new LinkedHashMap<>();
 
     if (target instanceof Info) {
@@ -367,7 +368,7 @@
         parseDefaultProviderFields((DefaultInfo) declaredProvider, context, builder);
         defaultProviderProvidedExplicitly = true;
       } else {
-        builder.addSkylarkDeclaredProvider(declaredProvider);
+        builder.addStarlarkDeclaredProvider(declaredProvider);
       }
     }
 
@@ -408,7 +409,7 @@
       String fieldName,
       Object value)
       throws EvalException {
-    builder.addSkylarkTransitiveInfo(fieldName, value);
+    builder.addStarlarkTransitiveInfo(fieldName, value);
 
     if (value instanceof Info) {
       Info info = (Info) value;
@@ -419,11 +420,11 @@
         builder.addNativeDeclaredProvider(info);
       }
 
-      if (info.getProvider() instanceof NativeProvider.WithLegacySkylarkName) {
-        NativeProvider.WithLegacySkylarkName providerWithLegacyName =
-            (NativeProvider.WithLegacySkylarkName) info.getProvider();
+      if (info.getProvider() instanceof NativeProvider.WithLegacyStarlarkName) {
+        WithLegacyStarlarkName providerWithLegacyName =
+            (WithLegacyStarlarkName) info.getProvider();
         if (shouldAddWithLegacyKey(oldStyleProviders, providerWithLegacyName)) {
-          builder.addSkylarkTransitiveInfo(providerWithLegacyName.getSkylarkName(), info);
+          builder.addStarlarkTransitiveInfo(providerWithLegacyName.getStarlarkName(), info);
         }
       }
     }
@@ -440,9 +441,9 @@
     if (builder.containsProviderKey(info.getProvider().getKey())) {
       return false;
     }
-    if (info.getProvider() instanceof NativeProvider.WithLegacySkylarkName) {
+    if (info.getProvider() instanceof NativeProvider.WithLegacyStarlarkName) {
       String canonicalLegacyKey =
-          ((NativeProvider.WithLegacySkylarkName) info.getProvider()).getSkylarkName();
+          ((WithLegacyStarlarkName) info.getProvider()).getStarlarkName();
       // Add info using its modern key if it was specified using its canonical legacy key, or
       // if no provider was used using that canonical legacy key.
       return fieldName.equals(canonicalLegacyKey)
@@ -454,9 +455,9 @@
 
   @SuppressWarnings("deprecation") // For legacy migrations
   private static boolean shouldAddWithLegacyKey(
-      StructImpl oldStyleProviders, NativeProvider.WithLegacySkylarkName provider)
+      StructImpl oldStyleProviders, WithLegacyStarlarkName provider)
       throws EvalException {
-    String canonicalLegacyKey = provider.getSkylarkName();
+    String canonicalLegacyKey = provider.getStarlarkName();
     // Add info using its canonical legacy key if no provider was specified using that canonical
     // legacy key.
     return oldStyleProviders.getValue(canonicalLegacyKey) == null;
@@ -568,7 +569,7 @@
     if (executable == null && context.isExecutable()) {
       if (context.isDefaultExecutableCreated()) {
         // This doesn't actually create a new Artifact just returns the one
-        // created in SkylarkRuleContext.
+        // created in StarlarkRuleContext.
         executable = context.getRuleContext().createOutputArtifact();
       } else {
         throw new EvalException(loc,
@@ -649,7 +650,7 @@
     if (ruleContext.getRule().getRuleClassObject().isStarlarkTestable()) {
       Info actions =
           ActionsProvider.create(ruleContext.getAnalysisEnvironment().getRegisteredActions());
-      builder.addSkylarkDeclaredProvider(actions);
+      builder.addStarlarkDeclaredProvider(actions);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleTransitionProvider.java
index 921cc18..2de919b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkRuleTransitionProvider.java
@@ -89,7 +89,7 @@
           continue;
         }
         attributes.put(
-            Attribute.getSkylarkName(attribute.getPublicName()), Starlark.fromJava(val, null));
+            Attribute.getStarlarkName(attribute.getPublicName()), Starlark.fromJava(val, null));
       }
       attrObject =
           StructProvider.STRUCT.create(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java b/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java
index 4afe97c..1040a25 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java
@@ -16,6 +16,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
+import com.google.devtools.build.lib.bazel.repository.skylark.StarlarkRepositoryDebugModule;
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.BlazeRuntime;
 import java.io.IOException;
@@ -49,7 +50,7 @@
           com.google.devtools.build.lib.bazel.BazelDiffAwarenessModule.class,
           com.google.devtools.build.lib.remote.RemoteModule.class,
           com.google.devtools.build.lib.bazel.BazelRepositoryModule.class,
-          com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryDebugModule.class,
+          StarlarkRepositoryDebugModule.class,
           com.google.devtools.build.lib.bazel.debug.WorkspaceRuleModule.class,
           com.google.devtools.build.lib.bazel.coverage.BazelCoverageReportModule.class,
           com.google.devtools.build.lib.collect.nestedset.NestedSetOptionsModule.class,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
index 0bcdb36..0b9c961 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
@@ -36,8 +36,8 @@
 import com.google.devtools.build.lib.bazel.repository.downloader.DelegatingDownloader;
 import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
 import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
-import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryFunction;
-import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryModule;
+import com.google.devtools.build.lib.bazel.repository.skylark.StarlarkRepositoryFunction;
+import com.google.devtools.build.lib.bazel.repository.skylark.StarlarkRepositoryModule;
 import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryFunction;
 import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryRule;
 import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryFunction;
@@ -100,7 +100,7 @@
   // A map of repository handlers that can be looked up by rule class name.
   private final ImmutableMap<String, RepositoryFunction> repositoryHandlers;
   private final AtomicBoolean isFetch = new AtomicBoolean(false);
-  private final SkylarkRepositoryFunction skylarkRepositoryFunction;
+  private final StarlarkRepositoryFunction starlarkRepositoryFunction;
   private final RepositoryCache repositoryCache = new RepositoryCache();
   private final HttpDownloader httpDownloader = new HttpDownloader();
   private final DelegatingDownloader delegatingDownloader =
@@ -119,7 +119,7 @@
   private final ManagedDirectoriesKnowledgeImpl managedDirectoriesKnowledge;
 
   public BazelRepositoryModule() {
-    this.skylarkRepositoryFunction = new SkylarkRepositoryFunction(downloadManager);
+    this.starlarkRepositoryFunction = new StarlarkRepositoryFunction(downloadManager);
     this.repositoryHandlers = repositoryRules();
     ManagedDirectoriesListener listener =
         repositoryNamesWithManagedDirs -> {
@@ -195,7 +195,7 @@
     RepositoryDelegatorFunction repositoryDelegatorFunction =
         new RepositoryDelegatorFunction(
             repositoryHandlers,
-            skylarkRepositoryFunction,
+            starlarkRepositoryFunction,
             isFetch,
             clientEnvironmentSupplier,
             directories,
@@ -220,7 +220,7 @@
       }
       builder.addRuleDefinition(ruleDefinition);
     }
-    builder.addSkylarkBootstrap(new RepositoryBootstrap(new SkylarkRepositoryModule()));
+    builder.addSkylarkBootstrap(new RepositoryBootstrap(new StarlarkRepositoryModule()));
   }
 
   @Override
@@ -232,20 +232,20 @@
     resolvedFileReplacingWorkspace = Optional.<RootedPath>absent();
     outputVerificationRules = ImmutableSet.<String>of();
 
-    skylarkRepositoryFunction.setProcessWrapper(ProcessWrapper.fromCommandEnvironment(env));
+    starlarkRepositoryFunction.setProcessWrapper(ProcessWrapper.fromCommandEnvironment(env));
 
     RepositoryOptions repoOptions = env.getOptions().getOptions(RepositoryOptions.class);
     if (repoOptions != null) {
       repositoryCache.setHardlink(repoOptions.useHardlinks);
       if (repoOptions.experimentalScaleTimeouts > 0.0) {
-        skylarkRepositoryFunction.setTimeoutScaling(repoOptions.experimentalScaleTimeouts);
+        starlarkRepositoryFunction.setTimeoutScaling(repoOptions.experimentalScaleTimeouts);
       } else {
         env.getReporter()
             .handle(
                 Event.warn(
                     "Ignoring request to scale timeouts for repositories by a non-positive"
                         + " factor"));
-        skylarkRepositoryFunction.setTimeoutScaling(1.0);
+        starlarkRepositoryFunction.setTimeoutScaling(1.0);
       }
       if (repoOptions.experimentalRepositoryCache != null) {
         // A set but empty path indicates a request to disable the repository cache.
@@ -353,7 +353,7 @@
       if (remoteExecutorFactory != null) {
         remoteExecutor = remoteExecutorFactory.create();
       }
-      skylarkRepositoryFunction.setRepositoryRemoteExecutor(remoteExecutor);
+      starlarkRepositoryFunction.setRepositoryRemoteExecutor(remoteExecutor);
       delegatingDownloader.setDelegate(env.getRuntime().getDownloaderSupplier().get());
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index 7a61558..195ac21 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.analysis.NoBuildEvent;
 import com.google.devtools.build.lib.analysis.NoBuildRequestFinishedEvent;
 import com.google.devtools.build.lib.bazel.repository.RepositoryOrderEvent;
-import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryFunction;
+import com.google.devtools.build.lib.bazel.repository.skylark.StarlarkRepositoryFunction;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelConstants;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -235,7 +235,7 @@
     if (options.configure) {
       // If this is only a configure run, only sync Starlark rules that
       // declare themselves as configure-like.
-      return SkylarkRepositoryFunction.isConfigureRule(rule);
+      return StarlarkRepositoryFunction.isConfigureRule(rule);
     }
     if (rule.getRuleClassObject().isStarlark()) {
       // Starlark rules are all whitelisted
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkExecutionResult.java
similarity index 91%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkExecutionResult.java
index 655d50c..a199ae8 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkExecutionResult.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkExecutionResult.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.shell.CommandException;
 import com.google.devtools.build.lib.shell.CommandResult;
 import com.google.devtools.build.lib.shell.TerminationStatus;
-import com.google.devtools.build.lib.skylarkbuildapi.repository.SkylarkExecutionResultApi;
+import com.google.devtools.build.lib.skylarkbuildapi.repository.StarlarkExecutionResultApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.io.DelegatingOutErr;
 import com.google.devtools.build.lib.util.io.OutErr;
@@ -42,12 +42,12 @@
  * return code.
  */
 @Immutable
-final class SkylarkExecutionResult implements SkylarkExecutionResultApi {
+final class StarlarkExecutionResult implements StarlarkExecutionResultApi {
   private final int returnCode;
   private final String stdout;
   private final String stderr;
 
-  SkylarkExecutionResult(int returnCode, String stdout, String stderr) {
+  StarlarkExecutionResult(int returnCode, String stdout, String stderr) {
     this.returnCode = returnCode;
     this.stdout = stdout;
     this.stderr = stderr;
@@ -79,7 +79,7 @@
   }
 
   /**
-   * A Builder class to build a {@link SkylarkExecutionResult} object by executing a command.
+   * A Builder class to build a {@link StarlarkExecutionResult} object by executing a command.
    */
   static final class Builder {
 
@@ -146,7 +146,7 @@
     }
 
     /** Execute the command specified by {@link #addArguments(Iterable)}. */
-    SkylarkExecutionResult execute() throws EvalException, InterruptedException {
+    StarlarkExecutionResult execute() throws EvalException, InterruptedException {
       Preconditions.checkArgument(timeout > 0, "Timeout must be set prior to calling execute().");
       Preconditions.checkArgument(!args.isEmpty(), "No command specified.");
       Preconditions.checkState(!executed, "Command was already executed, cannot re-use builder.");
@@ -170,21 +170,21 @@
         Command command = new Command(argsArray, envBuilder, directory, Duration.ofMillis(timeout));
         CommandResult result =
             command.execute(delegator.getOutputStream(), delegator.getErrorStream());
-        return new SkylarkExecutionResult(
+        return new StarlarkExecutionResult(
             result.getTerminationStatus().getExitCode(),
             recorder.outAsLatin1(),
             recorder.errAsLatin1());
       } catch (BadExitStatusException e) {
-        return new SkylarkExecutionResult(
+        return new StarlarkExecutionResult(
             e.getResult().getTerminationStatus().getExitCode(), recorder.outAsLatin1(),
             recorder.errAsLatin1());
       } catch (AbnormalTerminationException e) {
         TerminationStatus status = e.getResult().getTerminationStatus();
         if (status.timedOut()) {
           // Signal a timeout by an exit code outside the normal range
-          return new SkylarkExecutionResult(256, "", e.getMessage());
+          return new StarlarkExecutionResult(256, "", e.getMessage());
         } else if (status.exited()) {
-          return new SkylarkExecutionResult(
+          return new StarlarkExecutionResult(
               status.getExitCode(),
               toString(e.getResult().getStdoutStream()),
               toString(e.getResult().getStderrStream()));
@@ -198,7 +198,7 @@
           // to write their rules without relying on the ability to handle termination by signal 15.
           throw new InterruptedException();
         } else {
-          return new SkylarkExecutionResult(
+          return new StarlarkExecutionResult(
               status.getRawExitCode(),
               toString(e.getResult().getStdoutStream()),
               toString(e.getResult().getStderrStream()));
@@ -206,7 +206,7 @@
       } catch (CommandException e) {
         // 256 is outside of the standard range for exit code on Unixes. We are not guaranteed that
         // on all system it would be outside of the standard range.
-        return new SkylarkExecutionResult(256, "", e.getMessage());
+        return new StarlarkExecutionResult(256, "", e.getMessage());
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkOS.java
similarity index 92%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkOS.java
index 0a297f8..daf8435 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkOS.java
@@ -16,17 +16,16 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skylarkbuildapi.repository.SkylarkOSApi;
-
+import com.google.devtools.build.lib.skylarkbuildapi.repository.StarlarkOSApi;
 import java.util.Map;
 
 /** A Starlark structure to deliver information about the system we are running on. */
 @Immutable
-final class SkylarkOS implements SkylarkOSApi {
+final class StarlarkOS implements StarlarkOSApi {
 
   private final ImmutableMap<String, String> environ;
 
-  SkylarkOS(Map<String, String> environ) {
+  StarlarkOS(Map<String, String> environ) {
     this.environ = ImmutableMap.copyOf(environ);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkPath.java
similarity index 72%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkPath.java
index f192754..98b80d9 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkPath.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkPath.java
@@ -25,13 +25,13 @@
  * A Path object to be used into Starlark remote repository.
  *
  * <p>This path object enable non-hermetic operations from Starlark and should not be returned by
- * something other than a SkylarkRepositoryContext.
+ * something other than a StarlarkRepositoryContext.
  */
 @Immutable
-final class SkylarkPath implements RepositoryPathApi<SkylarkPath> {
+final class StarlarkPath implements RepositoryPathApi<StarlarkPath> {
   private final Path path;
 
-  SkylarkPath(Path path) {
+  StarlarkPath(Path path) {
     this.path = path;
   }
 
@@ -41,7 +41,7 @@
 
   @Override
   public boolean equals(Object obj) {
-    return (obj instanceof SkylarkPath) &&  path.equals(((SkylarkPath) obj).path);
+    return (obj instanceof StarlarkPath) &&  path.equals(((StarlarkPath) obj).path);
   }
 
   @Override
@@ -55,23 +55,23 @@
   }
 
   @Override
-  public ImmutableList<SkylarkPath> readdir() throws IOException {
-    ImmutableList.Builder<SkylarkPath> builder = ImmutableList.builder();
+  public ImmutableList<StarlarkPath> readdir() throws IOException {
+    ImmutableList.Builder<StarlarkPath> builder = ImmutableList.builder();
     for (Path p : path.getDirectoryEntries()) {
-      builder.add(new SkylarkPath(p));
+      builder.add(new StarlarkPath(p));
     }
     return builder.build();
   }
 
   @Override
-  public SkylarkPath getDirname() {
+  public StarlarkPath getDirname() {
     Path parentPath = path.getParentDirectory();
-    return parentPath == null ? null : new SkylarkPath(parentPath);
+    return parentPath == null ? null : new StarlarkPath(parentPath);
   }
 
   @Override
-  public SkylarkPath getChild(String childPath) {
-    return new SkylarkPath(path.getChild(childPath));
+  public StarlarkPath getChild(String childPath) {
+    return new StarlarkPath(path.getChild(childPath));
   }
 
   @Override
@@ -80,8 +80,8 @@
   }
 
   @Override
-  public SkylarkPath realpath() throws IOException {
-    return new SkylarkPath(path.resolveSymbolicLinks());
+  public StarlarkPath realpath() throws IOException {
+    return new StarlarkPath(path.resolveSymbolicLinks());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryContext.java
similarity index 93%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryContext.java
index c82863a..af8d8bf 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryContext.java
@@ -51,7 +51,7 @@
 import com.google.devtools.build.lib.runtime.ProcessWrapper;
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor.ExecutionResult;
-import com.google.devtools.build.lib.skylarkbuildapi.repository.SkylarkRepositoryContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.repository.StarlarkRepositoryContextApi;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Location;
@@ -90,8 +90,8 @@
 import javax.annotation.Nullable;
 
 /** Starlark API for the repository_rule's context. */
-public class SkylarkRepositoryContext
-    implements SkylarkRepositoryContextApi<RepositoryFunctionException> {
+public class StarlarkRepositoryContext
+    implements StarlarkRepositoryContextApi<RepositoryFunctionException> {
   private static final ImmutableList<String> WHITELISTED_REPOS_FOR_FLAG_ENABLED =
       ImmutableList.of("@rules_cc", "@bazel_tools");
   private static final ImmutableList<String> WHITELISTED_PATHS_FOR_FLAG_ENABLED =
@@ -106,7 +106,7 @@
   private final PathPackageLocator packageLocator;
   private final Path outputDirectory;
   private final StructImpl attrObject;
-  private final SkylarkOS osObject;
+  private final StarlarkOS osObject;
   private final ImmutableSet<PathFragment> blacklistedPatterns;
   private final Environment env;
   private final DownloadManager downloadManager;
@@ -120,7 +120,7 @@
    * Create a new context (repository_ctx) object for a Starlark repository rule ({@code rule}
    * argument).
    */
-  SkylarkRepositoryContext(
+  StarlarkRepositoryContext(
       Rule rule,
       PathPackageLocator packageLocator,
       Path outputDirectory,
@@ -139,7 +139,7 @@
     this.outputDirectory = outputDirectory;
     this.blacklistedPatterns = blacklistedPatterns;
     this.env = environment;
-    this.osObject = new SkylarkOS(env);
+    this.osObject = new StarlarkOS(env);
     this.downloadManager = downloadManager;
     this.timeoutScaling = timeoutScaling;
     this.processWrapper = processWrapper;
@@ -150,7 +150,7 @@
       if (!name.equals("$local")) {
         // Attribute values should be type safe
         attrBuilder.put(
-            Attribute.getSkylarkName(name), Starlark.fromJava(attrs.getObject(name), null));
+            Attribute.getStarlarkName(name), Starlark.fromJava(attrs.getObject(name), null));
       }
     }
     attrObject = StructProvider.STRUCT.create(attrBuilder.build(), "No such attribute '%s'");
@@ -168,19 +168,19 @@
     return attrObject;
   }
 
-  private SkylarkPath externalPath(String method, Object pathObject)
+  private StarlarkPath externalPath(String method, Object pathObject)
       throws EvalException, InterruptedException {
-    SkylarkPath skylarkPath = getPath(method, pathObject);
-    Path path = skylarkPath.getPath();
+    StarlarkPath starlarkPath = getPath(method, pathObject);
+    Path path = starlarkPath.getPath();
     if (packageLocator.getPathEntries().stream().noneMatch(root -> path.startsWith(root.asPath()))
         || path.startsWith(outputDirectory)) {
-      return skylarkPath;
+      return starlarkPath;
     }
     Path workspaceRoot = packageLocator.getWorkspaceFile().getParentDirectory();
     PathFragment relativePath = path.relativeTo(workspaceRoot);
     for (PathFragment blacklistedPattern : blacklistedPatterns) {
       if (relativePath.startsWith(blacklistedPattern)) {
-        return skylarkPath;
+        return starlarkPath;
       }
     }
     throw Starlark.errorf(
@@ -190,22 +190,22 @@
   }
 
   @Override
-  public SkylarkPath path(Object path) throws EvalException, InterruptedException {
+  public StarlarkPath path(Object path) throws EvalException, InterruptedException {
     return getPath("path()", path);
   }
 
-  private SkylarkPath getPath(String method, Object path)
+  private StarlarkPath getPath(String method, Object path)
       throws EvalException, InterruptedException {
     if (path instanceof String) {
       PathFragment pathFragment = PathFragment.create(path.toString());
-      return new SkylarkPath(
+      return new StarlarkPath(
           pathFragment.isAbsolute()
               ? outputDirectory.getFileSystem().getPath(path.toString())
               : outputDirectory.getRelative(pathFragment));
     } else if (path instanceof Label) {
       return getPathFromLabel((Label) path);
-    } else if (path instanceof SkylarkPath) {
-      return (SkylarkPath) path;
+    } else if (path instanceof StarlarkPath) {
+      return (StarlarkPath) path;
     } else {
       throw Starlark.errorf("%s can only take a string or a label.", method);
     }
@@ -239,8 +239,8 @@
   @Override
   public void symlink(Object from, Object to, StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
-    SkylarkPath fromPath = getPath("symlink()", from);
-    SkylarkPath toPath = getPath("symlink()", to);
+    StarlarkPath fromPath = getPath("symlink()", from);
+    StarlarkPath toPath = getPath("symlink()", to);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newSymlinkEvent(
             fromPath.toString(),
@@ -261,7 +261,7 @@
     }
   }
 
-  private void checkInOutputDirectory(String operation, SkylarkPath path)
+  private void checkInOutputDirectory(String operation, StarlarkPath path)
       throws RepositoryFunctionException {
     if (!path.getPath().getPathString().startsWith(outputDirectory.getPathString())) {
       throw new RepositoryFunctionException(
@@ -275,7 +275,7 @@
   public void createFile(
       Object path, String content, Boolean executable, Boolean legacyUtf8, StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
-    SkylarkPath p = getPath("file()", path);
+    StarlarkPath p = getPath("file()", path);
     byte[] contentBytes;
     if (legacyUtf8) {
       contentBytes = content.getBytes(StandardCharsets.UTF_8);
@@ -313,8 +313,8 @@
       Boolean executable,
       StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
-    SkylarkPath p = getPath("template()", path);
-    SkylarkPath t = getPath("template()", template);
+    StarlarkPath p = getPath("template()", path);
+    StarlarkPath t = getPath("template()", template);
     Map<String, String> substitutionMap =
         Dict.cast(substitutions, String.class, String.class, "substitutions");
     WorkspaceRuleEvent w =
@@ -349,7 +349,7 @@
   @Override
   public String readFile(Object path, StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
-    SkylarkPath p = getPath("read()", path);
+    StarlarkPath p = getPath("read()", path);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newReadEvent(
             p.toString(), rule.getLabel().toString(), thread.getCallerLocation());
@@ -370,7 +370,7 @@
   }
 
   @Override
-  public SkylarkOS getOS() {
+  public StarlarkOS getOS() {
     // Historically this event reported the location of the ctx.os expression,
     // but that's no longer available in the interpreter API. Now we report the
     // location of the rule's implementation function, and the user must inspect
@@ -422,7 +422,7 @@
     return Maps.immutableEntry(remotePath, localPath);
   }
 
-  private SkylarkExecutionResult executeRemote(
+  private StarlarkExecutionResult executeRemote(
       Sequence<?> argumentsUnchecked, // <String> or <Label> expected
       int timeout,
       Map<String, String> environment,
@@ -468,7 +468,7 @@
         outErr.printErr(stderr);
       }
 
-      return new SkylarkExecutionResult(result.exitCode(), stdout, stderr);
+      return new StarlarkExecutionResult(result.exitCode(), stdout, stderr);
     } catch (IOException e) {
       throw Starlark.errorf("remote_execute failed: %s", e.getMessage());
     }
@@ -484,7 +484,7 @@
               Location.BUILTIN, "Argument " + i + " of execute is neither a label nor a string.");
         }
       } else {
-        if (!(arg instanceof String || arg instanceof SkylarkPath)) {
+        if (!(arg instanceof String || arg instanceof StarlarkPath)) {
           throw new EvalException(
               Location.BUILTIN, "Argument " + i + " of execute is neither a path nor a string.");
         }
@@ -517,8 +517,8 @@
   }
 
   @Override
-  public SkylarkExecutionResult execute(
-      Sequence<?> arguments, // <String> or <SkylarkPath> or <Label> expected
+  public StarlarkExecutionResult execute(
+      Sequence<?> arguments, // <String> or <StarlarkPath> or <Label> expected
       Integer timeout,
       Dict<?, ?> uncheckedEnvironment, // <String, String> expected
       boolean quiet,
@@ -541,7 +541,7 @@
       if (arg instanceof Label) {
         args.add(getPathFromLabel((Label) arg).toString());
       } else {
-        // String or SkylarkPath expected
+        // String or StarlarkPath expected
         args.add(arg.toString());
       }
     }
@@ -577,7 +577,7 @@
     try (SilentCloseable c =
         Profiler.instance()
             .profile(ProfilerTask.STARLARK_REPOSITORY_FN, profileArgsDesc("local", args))) {
-      return SkylarkExecutionResult.builder(osObject.getEnvironmentVariables())
+      return StarlarkExecutionResult.builder(osObject.getEnvironmentVariables())
           .addArguments(args)
           .setDirectory(workingDirectoryPath.getPathFile())
           .addEnvironmentVariables(environment)
@@ -590,13 +590,13 @@
   @Override
   public boolean delete(Object pathObject, StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
-    SkylarkPath skylarkPath = externalPath("delete()", pathObject);
+    StarlarkPath starlarkPath = externalPath("delete()", pathObject);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newDeleteEvent(
-            skylarkPath.toString(), rule.getLabel().toString(), thread.getCallerLocation());
+            starlarkPath.toString(), rule.getLabel().toString(), thread.getCallerLocation());
     env.getListener().post(w);
     try {
-      Path path = skylarkPath.getPath();
+      Path path = starlarkPath.getPath();
       FileSystem fileSystem = path.getFileSystem();
       fileSystem.deleteTreesBelow(path);
       return fileSystem.delete(path);
@@ -608,16 +608,16 @@
   @Override
   public void patch(Object patchFile, Integer strip, StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
-    SkylarkPath skylarkPath = getPath("patch()", patchFile);
+    StarlarkPath starlarkPath = getPath("patch()", patchFile);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newPatchEvent(
-            skylarkPath.toString(), strip, rule.getLabel().toString(), thread.getCallerLocation());
+            starlarkPath.toString(), strip, rule.getLabel().toString(), thread.getCallerLocation());
     env.getListener().post(w);
     try {
-      PatchUtil.apply(skylarkPath.getPath(), strip, outputDirectory);
+      PatchUtil.apply(starlarkPath.getPath(), strip, outputDirectory);
     } catch (PatchFailedException e) {
       throw new RepositoryFunctionException(
-          Starlark.errorf("Error applying patch %s: %s", skylarkPath, e.getMessage()),
+          Starlark.errorf("Error applying patch %s: %s", starlarkPath, e.getMessage()),
           Transience.TRANSIENT);
     } catch (IOException e) {
       throw new RepositoryFunctionException(e, Transience.TRANSIENT);
@@ -625,7 +625,7 @@
   }
 
   @Override
-  public SkylarkPath which(String program, StarlarkThread thread) throws EvalException {
+  public StarlarkPath which(String program, StarlarkThread thread) throws EvalException {
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newWhichEvent(
             program, rule.getLabel().toString(), thread.getCallerLocation());
@@ -635,7 +635,7 @@
           "Program argument of which() may not contains a / or a \\ ('%s' given)", program);
     }
     try {
-      SkylarkPath commandPath = findCommandOnPath(program);
+      StarlarkPath commandPath = findCommandOnPath(program);
       if (commandPath != null) {
         return commandPath;
       }
@@ -651,7 +651,7 @@
     return null;
   }
 
-  private SkylarkPath findCommandOnPath(String program) throws IOException {
+  private StarlarkPath findCommandOnPath(String program) throws IOException {
     for (String p : getPathEnvironment()) {
       PathFragment fragment = PathFragment.create(p);
       if (fragment.isAbsolute()) {
@@ -659,7 +659,7 @@
         // root?).
         Path path = outputDirectory.getFileSystem().getPath(fragment).getChild(program);
         if (path.exists() && path.isFile(Symlinks.FOLLOW) && path.isExecutable()) {
-          return new SkylarkPath(path);
+          return new StarlarkPath(path);
         }
       }
     }
@@ -716,7 +716,7 @@
       checksumValidation = e;
     }
 
-    SkylarkPath outputPath = getPath("download()", output);
+    StarlarkPath outputPath = getPath("download()", output);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newDownloadEvent(
             urls,
@@ -767,14 +767,14 @@
   @Override
   public void extract(Object archive, Object output, String stripPrefix, StarlarkThread thread)
       throws RepositoryFunctionException, InterruptedException, EvalException {
-    SkylarkPath archivePath = getPath("extract()", archive);
+    StarlarkPath archivePath = getPath("extract()", archive);
 
     if (!archivePath.exists()) {
       throw new RepositoryFunctionException(
           Starlark.errorf("Archive path '%s' does not exist.", archivePath), Transience.TRANSIENT);
     }
 
-    SkylarkPath outputPath = getPath("extract()", output);
+    StarlarkPath outputPath = getPath("extract()", output);
     checkInOutputDirectory("write", outputPath);
 
     WorkspaceRuleEvent w =
@@ -843,7 +843,7 @@
             thread.getCallerLocation());
 
     // Download to outputDirectory and delete it after extraction
-    SkylarkPath outputPath = getPath("download_and_extract()", output);
+    StarlarkPath outputPath = getPath("download_and_extract()", output);
     checkInOutputDirectory("write", outputPath);
     createDirectory(outputPath.getPath());
 
@@ -1054,7 +1054,7 @@
 
   @VisibleForTesting
   static void setPathEnvironment(String... pathEnv) {
-    SkylarkRepositoryContext.pathEnv = ImmutableList.<String>copyOf(pathEnv);
+    StarlarkRepositoryContext.pathEnv = ImmutableList.<String>copyOf(pathEnv);
   }
 
   private ImmutableList<String> getPathEnvironment() {
@@ -1074,7 +1074,7 @@
   }
 
   // Resolve the label given by value into a file path.
-  private SkylarkPath getPathFromLabel(Label label) throws EvalException, InterruptedException {
+  private StarlarkPath getPathFromLabel(Label label) throws EvalException, InterruptedException {
     RootedPath rootedPath = RepositoryFunction.getRootedPathFromLabel(label, env);
     SkyKey fileSkyKey = FileValue.key(rootedPath);
     FileValue fileValue = null;
@@ -1097,7 +1097,7 @@
     } catch (IOException e) {
       throw Starlark.errorf("%s", e.getMessage());
     }
-    return new SkylarkPath(rootedPath.asPath());
+    return new StarlarkPath(rootedPath.asPath());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryDebugModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryDebugModule.java
similarity index 93%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryDebugModule.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryDebugModule.java
index cd4eae7..ef889a4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryDebugModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryDebugModule.java
@@ -29,7 +29,7 @@
  * involving that repository. This also covers cases where the definition of the repository is not
  * directly available, e.g., during detection of a dependency cycle.
  */
-public final class SkylarkRepositoryDebugModule extends BlazeModule {
+public final class StarlarkRepositoryDebugModule extends BlazeModule {
   Map<String, String> repositoryDefinitions;
   Reporter reporter;
   Set<String> reported;
@@ -50,7 +50,7 @@
   }
 
   @Subscribe
-  public synchronized void definitionLocation(SkylarkRepositoryDefinitionLocationEvent event) {
+  public synchronized void definitionLocation(StarlarkRepositoryDefinitionLocationEvent event) {
     repositoryDefinitions.put(event.getName(), event.getDefinitionInformation());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryDefinitionLocationEvent.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryDefinitionLocationEvent.java
similarity index 86%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryDefinitionLocationEvent.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryDefinitionLocationEvent.java
index 267bcaa..4eee065 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryDefinitionLocationEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryDefinitionLocationEvent.java
@@ -16,12 +16,12 @@
 import com.google.devtools.build.lib.events.ExtendedEventHandler.ProgressLike;
 
 /** Event reporting about the place where a Starlark repository rule was defined. */
-public class SkylarkRepositoryDefinitionLocationEvent implements ProgressLike {
+public class StarlarkRepositoryDefinitionLocationEvent implements ProgressLike {
 
   private final String name;
   private final String definitionInformation;
 
-  public SkylarkRepositoryDefinitionLocationEvent(String name, String definitionInformation) {
+  public StarlarkRepositoryDefinitionLocationEvent(String name, String definitionInformation) {
     this.name = name;
     this.definitionInformation = definitionInformation;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryFunction.java
similarity index 95%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryFunction.java
index 889f47e..46e99ec 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryFunction.java
@@ -56,7 +56,7 @@
 import javax.annotation.Nullable;
 
 /** A repository function to delegate work done by Starlark remote repositories. */
-public class SkylarkRepositoryFunction extends RepositoryFunction {
+public class StarlarkRepositoryFunction extends RepositoryFunction {
   static final String SEMANTICS = "STARLARK_SEMANTICS";
 
   private final DownloadManager downloadManager;
@@ -64,7 +64,7 @@
   @Nullable private ProcessWrapper processWrapper = null;
   @Nullable private RepositoryRemoteExecutor repositoryRemoteExecutor;
 
-  public SkylarkRepositoryFunction(DownloadManager downloadManager) {
+  public StarlarkRepositoryFunction(DownloadManager downloadManager) {
     this.downloadManager = downloadManager;
   }
 
@@ -107,7 +107,7 @@
       throws RepositoryFunctionException, InterruptedException {
 
     String defInfo = RepositoryResolvedEvent.getRuleDefinitionInformation(rule);
-    env.getListener().post(new SkylarkRepositoryDefinitionLocationEvent(rule.getName(), defInfo));
+    env.getListener().post(new StarlarkRepositoryDefinitionLocationEvent(rule.getName(), defInfo));
 
     StarlarkCallable function = rule.getRuleClassObject().getConfiguredTargetFunction();
     if (declareEnvironmentDependencies(markerData, env, getEnviron(rule)) == null) {
@@ -164,8 +164,8 @@
               /*transitiveDigest=*/ null)
           .storeInThread(thread);
 
-      SkylarkRepositoryContext skylarkRepositoryContext =
-          new SkylarkRepositoryContext(
+      StarlarkRepositoryContext starlarkRepositoryContext =
+          new StarlarkRepositoryContext(
               rule,
               packageLocator,
               outputDirectory,
@@ -179,7 +179,7 @@
               starlarkSemantics,
               repositoryRemoteExecutor);
 
-      if (skylarkRepositoryContext.isRemotable()) {
+      if (starlarkRepositoryContext.isRemotable()) {
         // If a rule is declared remotable then invalidate it if remote execution gets
         // enabled or disabled.
         PrecomputedValue.REMOTE_EXECUTION_ENABLED.get(env);
@@ -188,7 +188,7 @@
       // Since restarting a repository function can be really expensive, we first ensure that
       // all label-arguments can be resolved to paths.
       try {
-        skylarkRepositoryContext.enforceLabelAttributes();
+        starlarkRepositoryContext.enforceLabelAttributes();
       } catch (RepositoryMissingDependencyException e) {
         // Missing values are expected; just restart before we actually start the rule
         return null;
@@ -204,7 +204,7 @@
       // reproducible rule.
       //
       // Also we do a lot of stuff in there, maybe blocking operations and we should certainly make
-      // it possible to return null and not block but it doesn't seem to be easy with Skylark
+      // it possible to return null and not block but it doesn't seem to be easy with Starlark
       // structure as it is.
       Object result;
       try (SilentCloseable c =
@@ -214,12 +214,12 @@
             Starlark.call(
                 thread,
                 function,
-                /*args=*/ ImmutableList.of(skylarkRepositoryContext),
+                /*args=*/ ImmutableList.of(starlarkRepositoryContext),
                 /*kwargs=*/ ImmutableMap.of());
       }
       RepositoryResolvedEvent resolved =
           new RepositoryResolvedEvent(
-              rule, skylarkRepositoryContext.getAttr(), outputDirectory, result);
+              rule, starlarkRepositoryContext.getAttr(), outputDirectory, result);
       if (resolved.isNewInformationReturned()) {
         env.getListener().handle(Event.debug(resolved.getMessage()));
         env.getListener().handle(Event.debug(defInfo));
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryModule.java
similarity index 99%
rename from src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
rename to src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryModule.java
index 6953144..394d07e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/StarlarkRepositoryModule.java
@@ -52,7 +52,7 @@
  * The Starlark module containing the definition of {@code repository_rule} function to define a
  * Starlark remote repository.
  */
-public class SkylarkRepositoryModule implements RepositoryModuleApi {
+public class StarlarkRepositoryModule implements RepositoryModuleApi {
 
   @Override
   public StarlarkCallable repositoryRule(
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
index cbbf93b..9adeab9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
@@ -35,15 +35,15 @@
 public final class AdvertisedProviderSet {
   private final boolean canHaveAnyProvider;
   private final ImmutableSet<Class<?>> nativeProviders;
-  private final ImmutableSet<StarlarkProviderIdentifier> skylarkProviders;
+  private final ImmutableSet<StarlarkProviderIdentifier> starlarkProviders;
 
   private AdvertisedProviderSet(
       boolean canHaveAnyProvider,
       ImmutableSet<Class<?>> nativeProviders,
-      ImmutableSet<StarlarkProviderIdentifier> skylarkProviders) {
+      ImmutableSet<StarlarkProviderIdentifier> starlarkProviders) {
     this.canHaveAnyProvider = canHaveAnyProvider;
     this.nativeProviders = nativeProviders;
-    this.skylarkProviders = skylarkProviders;
+    this.starlarkProviders = starlarkProviders;
   }
 
   public static final AdvertisedProviderSet ANY =
@@ -55,16 +55,16 @@
 
   public static AdvertisedProviderSet create(
       ImmutableSet<Class<?>> nativeProviders,
-      ImmutableSet<StarlarkProviderIdentifier> skylarkProviders) {
-    if (nativeProviders.isEmpty() && skylarkProviders.isEmpty()) {
+      ImmutableSet<StarlarkProviderIdentifier> starlarkProviders) {
+    if (nativeProviders.isEmpty() && starlarkProviders.isEmpty()) {
       return EMPTY;
     }
-    return new AdvertisedProviderSet(false, nativeProviders, skylarkProviders);
+    return new AdvertisedProviderSet(false, nativeProviders, starlarkProviders);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(canHaveAnyProvider, nativeProviders, skylarkProviders);
+    return Objects.hash(canHaveAnyProvider, nativeProviders, starlarkProviders);
   }
 
   @Override
@@ -80,7 +80,7 @@
     AdvertisedProviderSet that = (AdvertisedProviderSet) obj;
     return Objects.equals(this.canHaveAnyProvider, that.canHaveAnyProvider)
         && Objects.equals(this.nativeProviders, that.nativeProviders)
-        && Objects.equals(this.skylarkProviders, that.skylarkProviders);
+        && Objects.equals(this.starlarkProviders, that.starlarkProviders);
   }
 
   @Override
@@ -90,7 +90,7 @@
     }
     return String.format(
         "allowed native providers=%s, allowed Starlark providers=%s",
-        getNativeProviders(), getSkylarkProviders());
+        getNativeProviders(), getStarlarkProviders());
   }
 
   /** Checks whether the rule can have any provider.
@@ -109,8 +109,8 @@
   }
 
   /** Get all advertised Starlark providers. */
-  public ImmutableSet<StarlarkProviderIdentifier> getSkylarkProviders() {
-    return skylarkProviders;
+  public ImmutableSet<StarlarkProviderIdentifier> getStarlarkProviders() {
+    return starlarkProviders;
   }
 
   public static Builder builder() {
@@ -132,22 +132,22 @@
    * Returns {@code true} if this provider set can have any provider, or if it advertises the
    * specific Starlark provider requested.
    */
-  public boolean advertises(StarlarkProviderIdentifier skylarkProvider) {
+  public boolean advertises(StarlarkProviderIdentifier starlarkProvider) {
     if (canHaveAnyProvider()) {
       return true;
     }
-    return skylarkProviders.contains(skylarkProvider);
+    return starlarkProviders.contains(starlarkProvider);
   }
 
   /** Builder for {@link AdvertisedProviderSet} */
   public static class Builder {
     private boolean canHaveAnyProvider;
     private final ArrayList<Class<?>> nativeProviders;
-    private final ArrayList<StarlarkProviderIdentifier> skylarkProviders;
+    private final ArrayList<StarlarkProviderIdentifier> starlarkProviders;
 
     private Builder() {
       nativeProviders = new ArrayList<>();
-      skylarkProviders = new ArrayList<>();
+      starlarkProviders = new ArrayList<>();
     }
 
     /**
@@ -158,7 +158,7 @@
       Preconditions.checkState(!parentSet.canHaveAnyProvider(),
           "Cannot inherit from alias rules");
       nativeProviders.addAll(parentSet.getNativeProviders());
-      skylarkProviders.addAll(parentSet.getSkylarkProviders());
+      starlarkProviders.addAll(parentSet.getStarlarkProviders());
       return this;
     }
 
@@ -168,31 +168,31 @@
     }
 
     public void canHaveAnyProvider() {
-      Preconditions.checkState(nativeProviders.isEmpty() && skylarkProviders.isEmpty());
+      Preconditions.checkState(nativeProviders.isEmpty() && starlarkProviders.isEmpty());
       this.canHaveAnyProvider = true;
     }
 
     public AdvertisedProviderSet build() {
       if (canHaveAnyProvider) {
-        Preconditions.checkState(nativeProviders.isEmpty() && skylarkProviders.isEmpty());
+        Preconditions.checkState(nativeProviders.isEmpty() && starlarkProviders.isEmpty());
         return ANY;
       }
       return AdvertisedProviderSet.create(
-          ImmutableSet.copyOf(nativeProviders), ImmutableSet.copyOf(skylarkProviders));
+          ImmutableSet.copyOf(nativeProviders), ImmutableSet.copyOf(starlarkProviders));
     }
 
-    public Builder addSkylark(String providerName) {
-      skylarkProviders.add(StarlarkProviderIdentifier.forLegacy(providerName));
+    public Builder addStarlark(String providerName) {
+      starlarkProviders.add(StarlarkProviderIdentifier.forLegacy(providerName));
       return this;
     }
 
-    public Builder addSkylark(StarlarkProviderIdentifier id) {
-      skylarkProviders.add(id);
+    public Builder addStarlark(StarlarkProviderIdentifier id) {
+      starlarkProviders.add(id);
       return this;
     }
 
-    public Builder addSkylark(Provider.Key id) {
-      skylarkProviders.add(StarlarkProviderIdentifier.forKey(id));
+    public Builder addStarlark(Provider.Key id) {
+      starlarkProviders.add(StarlarkProviderIdentifier.forKey(id));
       return this;
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
index 09ac766..e4f7f1a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
@@ -312,7 +312,7 @@
     /** State that the aspect being built provides given providers. */
     public Builder advertiseProvider(ImmutableList<StarlarkProviderIdentifier> providers) {
       for (StarlarkProviderIdentifier provider : providers) {
-        advertisedProviders.addSkylark(provider);
+        advertisedProviders.addStarlark(provider);
       }
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index f78c98e..b8f36b0 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -1978,7 +1978,7 @@
    * of '$' or ':').
    */
   public String getPublicName() {
-    return getSkylarkName(getName());
+    return getStarlarkName(getName());
   }
 
   /**
@@ -2297,7 +2297,7 @@
    *
    * <p>Implicit and late-bound attributes start with '_' (instead of '$' or ':').
    */
-  public static String getSkylarkName(String nativeAttrName) {
+  public static String getStarlarkName(String nativeAttrName) {
     if (isPrivateAttribute(nativeAttrName)) {
       return "_" + nativeAttrName.substring(1);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index c7c0b32..86db1f6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -101,7 +101,7 @@
         if (!map.isConfigurable(attrName)) {
           Object value = map.get(attrName, attrType);
           attrValues.put(
-              Attribute.getSkylarkName(attrName), Starlark.fromJava(value, /*mutability=*/ null));
+              Attribute.getStarlarkName(attrName), Starlark.fromJava(value, /*mutability=*/ null));
         }
       }
       ClassObject attrs =
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
index 057b6bc..5cf3f82 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
@@ -56,8 +56,8 @@
    * Starlark code.
    */
   @Deprecated
-  public interface WithLegacySkylarkName {
-    String getSkylarkName();
+  public interface WithLegacyStarlarkName {
+    String getStarlarkName();
   }
 
   protected NativeProvider(Class<V> valueClass, String name) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
index 80ef7b2..fb2dea6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
@@ -138,7 +138,7 @@
         }
         return satisfies(
             advertisedProviderSet.getNativeProviders()::contains,
-            advertisedProviderSet.getSkylarkProviders()::contains,
+            advertisedProviderSet.getStarlarkProviders()::contains,
             requiredProviders,
             missing);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index a834483..c989e93 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -1147,7 +1147,7 @@
 
     public Builder advertiseStarlarkProvider(StarlarkProviderIdentifier... starlarkProviders) {
       for (StarlarkProviderIdentifier starlarkProviderIdentifier : starlarkProviders) {
-        advertisedProviders.addSkylark(starlarkProviderIdentifier);
+        advertisedProviders.addStarlark(starlarkProviderIdentifier);
       }
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
similarity index 91%
rename from src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java
rename to src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
index e885d9d..8fcf7ad 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
@@ -33,9 +33,9 @@
 import javax.annotation.Nullable;
 
 /** An Info (provider instance) for providers defined in Starlark. */
-public final class SkylarkInfo extends StructImpl implements HasBinary, ClassObject {
+public final class StarlarkInfo extends StructImpl implements HasBinary, ClassObject {
 
-  public static final Depset.ElementType TYPE = Depset.ElementType.of(SkylarkInfo.class);
+  public static final Depset.ElementType TYPE = Depset.ElementType.of(StarlarkInfo.class);
 
   // For a n-element info, the table contains n key strings, sorted,
   // followed by the n corresponding legal Starlark values.
@@ -48,7 +48,7 @@
   // relation, and other observable behaviors).
   @Nullable private final String unknownFieldError;
 
-  private SkylarkInfo(
+  private StarlarkInfo(
       Provider provider,
       Object[] table,
       @Nullable Location loc,
@@ -76,12 +76,12 @@
   }
 
   /**
-   * Constructs a SkylarkInfo from an array of alternating key/value pairs as provided by
+   * Constructs a StarlarkInfo from an array of alternating key/value pairs as provided by
    * Starlark.fastcall. Checks that each key is provided at most once, and is defined by the
    * optional schema, which must be sorted. This optimized zero-allocation function exists solely
-   * for the SkylarkProvider constructor.
+   * for the StarlarkProvider constructor.
    */
-  static SkylarkInfo createFromNamedArgs(
+  static StarlarkInfo createFromNamedArgs(
       Provider provider, Object[] table, @Nullable ImmutableList<String> schema, Location loc)
       throws EvalException {
     // Permute fastcall form (k, v, ..., k, v) into table form (k, k, ..., v, v).
@@ -115,12 +115,12 @@
       }
     }
 
-    return new SkylarkInfo(provider, table, loc, /*unknownFieldError=*/ null);
+    return new StarlarkInfo(provider, table, loc, /*unknownFieldError=*/ null);
   }
 
   // Permutes array elements from alternating keys/values form,
   // (as used by fastcall's named array) into keys-then-corresponding-values form,
-  // as used by SkylarkInfo.table.
+  // as used by StarlarkInfo.table.
   // The permutation preserves the key/value association but not the order of keys.
   static void permute(Object[] named) {
     int n = named.length >> 1; // number of K/V pairs
@@ -281,9 +281,9 @@
    * <p>{@code loc} is the creation location for this instance. Built-in provider instances may use
    * {@link Location#BUILTIN}, which is the default if null.
    */
-  public static SkylarkInfo create(
+  public static StarlarkInfo create(
       Provider provider, Map<String, Object> values, @Nullable Location loc) {
-    return new SkylarkInfo(provider, toTable(values), loc, /*unknownFieldError=*/ null);
+    return new StarlarkInfo(provider, toTable(values), loc, /*unknownFieldError=*/ null);
   }
 
   /**
@@ -305,23 +305,23 @@
   // this functionality, thereby saving a string pointer field for the majority of providers that
   // don't need it.
   @Deprecated
-  public static SkylarkInfo createWithCustomMessage(
+  public static StarlarkInfo createWithCustomMessage(
       Provider provider, Map<String, Object> values, String unknownFieldError) {
     Preconditions.checkNotNull(unknownFieldError);
-    return new SkylarkInfo(provider, toTable(values), Location.BUILTIN, unknownFieldError);
+    return new StarlarkInfo(provider, toTable(values), Location.BUILTIN, unknownFieldError);
   }
 
   @Override
-  public SkylarkInfo binaryOp(TokenKind op, Object that, boolean thisLeft) throws EvalException {
-    if (op == TokenKind.PLUS && that instanceof SkylarkInfo) {
+  public StarlarkInfo binaryOp(TokenKind op, Object that, boolean thisLeft) throws EvalException {
+    if (op == TokenKind.PLUS && that instanceof StarlarkInfo) {
       return thisLeft
-          ? plus(this, (SkylarkInfo) that) //
-          : plus((SkylarkInfo) that, this);
+          ? plus(this, (StarlarkInfo) that) //
+          : plus((StarlarkInfo) that, this);
     }
     return null;
   }
 
-  private static SkylarkInfo plus(SkylarkInfo x, SkylarkInfo y) throws EvalException {
+  private static StarlarkInfo plus(StarlarkInfo x, StarlarkInfo y) throws EvalException {
     Provider xprov = x.getProvider();
     Provider yprov = y.getProvider();
     if (!xprov.equals(yprov)) {
@@ -368,6 +368,6 @@
       zi++;
     }
 
-    return new SkylarkInfo(xprov, ztable, Location.BUILTIN, x.unknownFieldError);
+    return new StarlarkInfo(xprov, ztable, Location.BUILTIN, x.unknownFieldError);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
index ebf530d..87d10c8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
@@ -137,7 +137,7 @@
     if (positional.length > 0) {
       throw Starlark.errorf("%s: unexpected positional arguments", getName());
     }
-    return SkylarkInfo.createFromNamedArgs(this, named, schema, thread.getCallerLocation());
+    return StarlarkInfo.createFromNamedArgs(this, named, schema, thread.getCallerLocation());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
index 393ebc1..77a5184 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
@@ -55,7 +55,7 @@
     if (kwargs.containsKey("to_proto")) {
       throw Starlark.errorf("cannot override built-in struct function 'to_proto'");
     }
-    return SkylarkInfo.create(this, kwargs, location);
+    return StarlarkInfo.create(this, kwargs, location);
   }
 
   /**
@@ -65,7 +65,7 @@
    * providers, such as the {@code native} object, and the struct fields of {@code ctx} like {@code
    * ctx.attr}.
    */
-  public SkylarkInfo create(Map<String, Object> values, String errorMessageFormatForUnknownField) {
-    return SkylarkInfo.createWithCustomMessage(this, values, errorMessageFormatForUnknownField);
+  public StarlarkInfo create(Map<String, Object> values, String errorMessageFormatForUnknownField) {
+    return StarlarkInfo.createWithCustomMessage(this, values, errorMessageFormatForUnknownField);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 86b29eb..20de9b9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -243,7 +243,7 @@
 
     ruleBuilder
         .setFilesToBuild(filesToBuild)
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
         .addNativeDeclaredProvider(dataBindingV2Provider)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 61bb659..ec0152f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -724,7 +724,7 @@
         && !isLibrary) {
       // Binary rule; allow extracting merged manifest from Starlark via
       // ctx.attr.android_binary.android.merged_manifest, but not much more.
-      builder.addSkylarkTransitiveInfo(
+      builder.addStarlarkTransitiveInfo(
           AndroidStarlarkApiProvider.NAME, new AndroidStarlarkApiProvider(/*resourceInfo=*/ null));
     } else {
       resourceApk.addToConfiguredTargetBuilder(
@@ -733,7 +733,7 @@
 
     return builder
         .setFilesToBuild(filesToBuild)
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .addProvider(RunfilesProvider.class, RunfilesProvider.simple(getRunfiles()))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index cb99024..cba24a2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -362,7 +362,7 @@
 
     return builder
         .setFilesToBuild(filesToBuild)
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .addProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
index 36c946d..01e9bb4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
@@ -295,7 +295,7 @@
     }
 
     if (includeSkylarkApiProvider) {
-      builder.addSkylarkTransitiveInfo(
+      builder.addStarlarkTransitiveInfo(
           AndroidStarlarkApiProvider.NAME, new AndroidStarlarkApiProvider(resourceInfo));
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java b/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java
index f7a76f8..2286eb1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.packages.SkylarkInfo;
+import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ApplePlatformApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ApplePlatformTypeApi;
@@ -184,7 +184,7 @@
     for (ApplePlatform type : values()) {
       fields.put(type.skylarkKey, type);
     }
-    return SkylarkInfo.create(constructor, fields, Location.BUILTIN);
+    return StarlarkInfo.create(constructor, fields, Location.BUILTIN);
   }
 
   @Override
@@ -248,7 +248,7 @@
       for (PlatformType type : values()) {
         fields.put(type.skylarkKey, type);
       }
-      return SkylarkInfo.create(constructor, fields, Location.BUILTIN);
+      return StarlarkInfo.create(constructor, fields, Location.BUILTIN);
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index a56448c..205f90a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.packages.SkylarkInfo;
+import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
 import com.google.devtools.build.lib.rules.cpp.CcLinkingContext.LinkOptions;
@@ -793,7 +793,7 @@
     ImmutableList.Builder<Feature> featureBuilder = ImmutableList.builder();
     for (Object feature : features) {
       checkRightSkylarkInfoProvider(feature, "features", "FeatureInfo");
-      featureBuilder.add(featureFromSkylark((SkylarkInfo) feature));
+      featureBuilder.add(featureFromSkylark((StarlarkInfo) feature));
     }
     ImmutableList<Feature> featureList = featureBuilder.build();
 
@@ -805,7 +805,7 @@
     ImmutableList.Builder<ActionConfig> actionConfigBuilder = ImmutableList.builder();
     for (Object actionConfig : actionConfigs) {
       checkRightSkylarkInfoProvider(actionConfig, "action_configs", "ActionConfigInfo");
-      actionConfigBuilder.add(actionConfigFromSkylark((SkylarkInfo) actionConfig));
+      actionConfigBuilder.add(actionConfigFromSkylark((StarlarkInfo) actionConfig));
     }
     ImmutableList<ActionConfig> actionConfigList = actionConfigBuilder.build();
 
@@ -819,7 +819,7 @@
       checkRightSkylarkInfoProvider(
           artifactNamePattern, "artifact_name_patterns", "ArtifactNamePatternInfo");
       artifactNamePatternBuilder.add(
-          artifactNamePatternFromSkylark((SkylarkInfo) artifactNamePattern));
+          artifactNamePatternFromSkylark((StarlarkInfo) artifactNamePattern));
     }
 
     getLegacyArtifactNamePatterns(artifactNamePatternBuilder);
@@ -828,7 +828,7 @@
     ImmutableList.Builder<Pair<String, String>> toolPathPairs = ImmutableList.builder();
     for (Object toolPath : toolPaths) {
       checkRightSkylarkInfoProvider(toolPath, "tool_paths", "ToolPathInfo");
-      Pair<String, String> toolPathPair = toolPathFromSkylark((SkylarkInfo) toolPath);
+      Pair<String, String> toolPathPair = toolPathFromSkylark((StarlarkInfo) toolPath);
       toolPathPairs.add(toolPathPair);
     }
     ImmutableList<Pair<String, String>> toolPathList = toolPathPairs.build();
@@ -934,7 +934,7 @@
     ImmutableList.Builder<Pair<String, String>> makeVariablePairs = ImmutableList.builder();
     for (Object makeVariable : makeVariables) {
       checkRightSkylarkInfoProvider(makeVariable, "make_variables", "MakeVariableInfo");
-      Pair<String, String> makeVariablePair = makeVariableFromSkylark((SkylarkInfo) makeVariable);
+      Pair<String, String> makeVariablePair = makeVariableFromSkylark((StarlarkInfo) makeVariable);
       makeVariablePairs.add(makeVariablePair);
     }
 
@@ -959,7 +959,7 @@
 
   private static void checkRightSkylarkInfoProvider(
       Object o, String parameterName, String expectedProvider) throws EvalException {
-    if (!(o instanceof SkylarkInfo)) {
+    if (!(o instanceof StarlarkInfo)) {
       throw Starlark.errorf(
           "'%s' parameter of cc_common.create_cc_toolchain_config_info() contains an element"
               + " of type '%s' instead of a '%s' provider. Use the methods provided in"
@@ -969,8 +969,8 @@
     }
   }
 
-  /** Checks whether the {@link SkylarkInfo} is of the required type. */
-  private static void checkRightProviderType(SkylarkInfo provider, String type)
+  /** Checks whether the {@link StarlarkInfo} is of the required type. */
+  private static void checkRightProviderType(StarlarkInfo provider, String type)
       throws EvalException {
     String providerType = (String) getValueOrNull(provider, "type_name");
     if (providerType == null) {
@@ -991,9 +991,9 @@
     }
   }
 
-  /** Creates a {@link Feature} from a {@link SkylarkInfo}. */
+  /** Creates a {@link Feature} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static Feature featureFromSkylark(SkylarkInfo featureStruct) throws EvalException {
+  static Feature featureFromSkylark(StarlarkInfo featureStruct) throws EvalException {
     checkRightProviderType(featureStruct, "feature");
     String name = getMandatoryFieldFromSkylarkProvider(featureStruct, "name", String.class);
     Boolean enabled = getMandatoryFieldFromSkylarkProvider(featureStruct, "enabled", Boolean.class);
@@ -1013,9 +1013,9 @@
     }
 
     ImmutableList.Builder<FlagSet> flagSetBuilder = ImmutableList.builder();
-    ImmutableList<SkylarkInfo> flagSets =
+    ImmutableList<StarlarkInfo> flagSets =
         getSkylarkProviderListFromSkylarkField(featureStruct, "flag_sets");
-    for (SkylarkInfo flagSetObject : flagSets) {
+    for (StarlarkInfo flagSetObject : flagSets) {
       FlagSet flagSet = flagSetFromSkylark(flagSetObject, /* actionName= */ null);
       if (flagSet.getActions().isEmpty()) {
         throw new EvalException(
@@ -1026,17 +1026,17 @@
     }
 
     ImmutableList.Builder<EnvSet> envSetBuilder = ImmutableList.builder();
-    ImmutableList<SkylarkInfo> envSets =
+    ImmutableList<StarlarkInfo> envSets =
         getSkylarkProviderListFromSkylarkField(featureStruct, "env_sets");
-    for (SkylarkInfo envSet : envSets) {
+    for (StarlarkInfo envSet : envSets) {
       envSetBuilder.add(envSetFromSkylark(envSet));
     }
 
     ImmutableList.Builder<ImmutableSet<String>> requiresBuilder = ImmutableList.builder();
 
-    ImmutableList<SkylarkInfo> requires =
+    ImmutableList<StarlarkInfo> requires =
         getSkylarkProviderListFromSkylarkField(featureStruct, "requires");
-    for (SkylarkInfo featureSetStruct : requires) {
+    for (StarlarkInfo featureSetStruct : requires) {
       if (!"feature_set".equals(featureSetStruct.getValue("type_name"))) { // getValue() may be null
         throw new EvalException(
             featureStruct.getCreationLoc(), "expected object of type 'feature_set'.");
@@ -1064,10 +1064,10 @@
   /**
    * Creates a Pair(name, value) that represents a {@link
    * com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.MakeVariable} from a {@link
-   * SkylarkInfo}.
+   * StarlarkInfo}.
    */
   @VisibleForTesting
-  static Pair<String, String> makeVariableFromSkylark(SkylarkInfo makeVariableStruct)
+  static Pair<String, String> makeVariableFromSkylark(StarlarkInfo makeVariableStruct)
       throws EvalException {
     checkRightProviderType(makeVariableStruct, "make_variable");
     String name = getMandatoryFieldFromSkylarkProvider(makeVariableStruct, "name", String.class);
@@ -1088,10 +1088,11 @@
   /**
    * Creates a Pair(name, path) that represents a {@link
    * com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.ToolPath} from a {@link
-   * SkylarkInfo}.
+   * StarlarkInfo}.
    */
   @VisibleForTesting
-  static Pair<String, String> toolPathFromSkylark(SkylarkInfo toolPathStruct) throws EvalException {
+  static Pair<String, String> toolPathFromSkylark(StarlarkInfo toolPathStruct)
+      throws EvalException {
     checkRightProviderType(toolPathStruct, "tool_path");
     String name = getMandatoryFieldFromSkylarkProvider(toolPathStruct, "name", String.class);
     String path = getMandatoryFieldFromSkylarkProvider(toolPathStruct, "path", String.class);
@@ -1108,9 +1109,9 @@
     return Pair.of(name, path);
   }
 
-  /** Creates a {@link VariableWithValue} from a {@link SkylarkInfo}. */
+  /** Creates a {@link VariableWithValue} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static VariableWithValue variableWithValueFromSkylark(SkylarkInfo variableWithValueStruct)
+  static VariableWithValue variableWithValueFromSkylark(StarlarkInfo variableWithValueStruct)
       throws EvalException {
     checkRightProviderType(variableWithValueStruct, "variable_with_value");
     String name =
@@ -1130,9 +1131,9 @@
     return new VariableWithValue(name, value);
   }
 
-  /** Creates an {@link EnvEntry} from a {@link SkylarkInfo}. */
+  /** Creates an {@link EnvEntry} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static EnvEntry envEntryFromSkylark(SkylarkInfo envEntryStruct) throws EvalException {
+  static EnvEntry envEntryFromSkylark(StarlarkInfo envEntryStruct) throws EvalException {
     checkRightProviderType(envEntryStruct, "env_entry");
     String key = getMandatoryFieldFromSkylarkProvider(envEntryStruct, "key", String.class);
     String value = getMandatoryFieldFromSkylarkProvider(envEntryStruct, "value", String.class);
@@ -1150,9 +1151,9 @@
     return new EnvEntry(key, parser.getChunks());
   }
 
-  /** Creates a {@link WithFeatureSet} from a {@link SkylarkInfo}. */
+  /** Creates a {@link WithFeatureSet} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static WithFeatureSet withFeatureSetFromSkylark(SkylarkInfo withFeatureSetStruct)
+  static WithFeatureSet withFeatureSetFromSkylark(StarlarkInfo withFeatureSetStruct)
       throws EvalException {
     checkRightProviderType(withFeatureSetStruct, "with_feature_set");
     ImmutableSet<String> features =
@@ -1162,9 +1163,9 @@
     return new WithFeatureSet(features, notFeatures);
   }
 
-  /** Creates an {@link EnvSet} from a {@link SkylarkInfo}. */
+  /** Creates an {@link EnvSet} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static EnvSet envSetFromSkylark(SkylarkInfo envSetStruct) throws EvalException {
+  static EnvSet envSetFromSkylark(StarlarkInfo envSetStruct) throws EvalException {
     checkRightProviderType(envSetStruct, "env_set");
     ImmutableSet<String> actions = getStringSetFromSkylarkProviderField(envSetStruct, "actions");
     if (actions.isEmpty()) {
@@ -1172,24 +1173,24 @@
           envSetStruct.getCreationLoc(), "actions parameter of env_set must be a nonempty list.");
     }
     ImmutableList.Builder<EnvEntry> envEntryBuilder = ImmutableList.builder();
-    ImmutableList<SkylarkInfo> envEntryStructs =
+    ImmutableList<StarlarkInfo> envEntryStructs =
         getSkylarkProviderListFromSkylarkField(envSetStruct, "env_entries");
-    for (SkylarkInfo envEntryStruct : envEntryStructs) {
+    for (StarlarkInfo envEntryStruct : envEntryStructs) {
       envEntryBuilder.add(envEntryFromSkylark(envEntryStruct));
     }
 
     ImmutableSet.Builder<WithFeatureSet> withFeatureSetBuilder = ImmutableSet.builder();
-    ImmutableList<SkylarkInfo> withFeatureSetStructs =
+    ImmutableList<StarlarkInfo> withFeatureSetStructs =
         getSkylarkProviderListFromSkylarkField(envSetStruct, "with_features");
-    for (SkylarkInfo withFeatureSetStruct : withFeatureSetStructs) {
+    for (StarlarkInfo withFeatureSetStruct : withFeatureSetStructs) {
       withFeatureSetBuilder.add(withFeatureSetFromSkylark(withFeatureSetStruct));
     }
     return new EnvSet(actions, envEntryBuilder.build(), withFeatureSetBuilder.build());
   }
 
-  /** Creates a {@link FlagGroup} from a {@link SkylarkInfo}. */
+  /** Creates a {@link FlagGroup} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static FlagGroup flagGroupFromSkylark(SkylarkInfo flagGroupStruct) throws EvalException {
+  static FlagGroup flagGroupFromSkylark(StarlarkInfo flagGroupStruct) throws EvalException {
     checkRightProviderType(flagGroupStruct, "flag_group");
 
     ImmutableList.Builder<Expandable> expandableBuilder = ImmutableList.builder();
@@ -1199,9 +1200,9 @@
       expandableBuilder.add(Flag.create(parser.getChunks()));
     }
 
-    ImmutableList<SkylarkInfo> flagGroups =
+    ImmutableList<StarlarkInfo> flagGroups =
         getSkylarkProviderListFromSkylarkField(flagGroupStruct, "flag_groups");
-    for (SkylarkInfo flagGroup : flagGroups) {
+    for (StarlarkInfo flagGroup : flagGroups) {
       expandableBuilder.add(flagGroupFromSkylark(flagGroup));
     }
 
@@ -1227,8 +1228,9 @@
         getMandatoryFieldFromSkylarkProvider(flagGroupStruct, "expand_if_true", String.class);
     String expandIfFalse =
         getMandatoryFieldFromSkylarkProvider(flagGroupStruct, "expand_if_false", String.class);
-    SkylarkInfo expandIfEqualStruct =
-        getMandatoryFieldFromSkylarkProvider(flagGroupStruct, "expand_if_equal", SkylarkInfo.class);
+    StarlarkInfo expandIfEqualStruct =
+        getMandatoryFieldFromSkylarkProvider(
+            flagGroupStruct, "expand_if_equal", StarlarkInfo.class);
     VariableWithValue expandIfEqual =
         expandIfEqualStruct == null ? null : variableWithValueFromSkylark(expandIfEqualStruct);
 
@@ -1242,9 +1244,9 @@
         expandIfEqual);
   }
 
-  /** Creates a {@link FlagSet} from a {@link SkylarkInfo}. */
+  /** Creates a {@link FlagSet} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static FlagSet flagSetFromSkylark(SkylarkInfo flagSetStruct, String actionName)
+  static FlagSet flagSetFromSkylark(StarlarkInfo flagSetStruct, String actionName)
       throws EvalException {
     checkRightProviderType(flagSetStruct, "flag_set");
     ImmutableSet<String> actions = getStringSetFromSkylarkProviderField(flagSetStruct, "actions");
@@ -1258,16 +1260,16 @@
       actions = ImmutableSet.of(actionName);
     }
     ImmutableList.Builder<FlagGroup> flagGroupsBuilder = ImmutableList.builder();
-    ImmutableList<SkylarkInfo> flagGroups =
+    ImmutableList<StarlarkInfo> flagGroups =
         getSkylarkProviderListFromSkylarkField(flagSetStruct, "flag_groups");
-    for (SkylarkInfo flagGroup : flagGroups) {
+    for (StarlarkInfo flagGroup : flagGroups) {
       flagGroupsBuilder.add(flagGroupFromSkylark(flagGroup));
     }
 
     ImmutableSet.Builder<WithFeatureSet> withFeatureSetBuilder = ImmutableSet.builder();
-    ImmutableList<SkylarkInfo> withFeatureSetStructs =
+    ImmutableList<StarlarkInfo> withFeatureSetStructs =
         getSkylarkProviderListFromSkylarkField(flagSetStruct, "with_features");
-    for (SkylarkInfo withFeatureSetStruct : withFeatureSetStructs) {
+    for (StarlarkInfo withFeatureSetStruct : withFeatureSetStructs) {
       withFeatureSetBuilder.add(withFeatureSetFromSkylark(withFeatureSetStruct));
     }
 
@@ -1277,10 +1279,10 @@
 
   /**
    * Creates a {@link com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Tool} from a
-   * {@link SkylarkInfo}.
+   * {@link StarlarkInfo}.
    */
   @VisibleForTesting
-  static CcToolchainFeatures.Tool toolFromSkylark(SkylarkInfo toolStruct) throws EvalException {
+  static CcToolchainFeatures.Tool toolFromSkylark(StarlarkInfo toolStruct) throws EvalException {
     checkRightProviderType(toolStruct, "tool");
 
     String toolPathString = getOptionalFieldFromSkylarkProvider(toolStruct, "path", String.class);
@@ -1314,9 +1316,9 @@
     Preconditions.checkState(toolPath != null && toolPathOrigin != null);
 
     ImmutableSet.Builder<WithFeatureSet> withFeatureSetBuilder = ImmutableSet.builder();
-    ImmutableList<SkylarkInfo> withFeatureSetStructs =
+    ImmutableList<StarlarkInfo> withFeatureSetStructs =
         getSkylarkProviderListFromSkylarkField(toolStruct, "with_features");
-    for (SkylarkInfo withFeatureSetStruct : withFeatureSetStructs) {
+    for (StarlarkInfo withFeatureSetStruct : withFeatureSetStructs) {
       withFeatureSetBuilder.add(withFeatureSetFromSkylark(withFeatureSetStruct));
     }
 
@@ -1326,9 +1328,10 @@
         toolPath, toolPathOrigin, executionRequirements, withFeatureSetBuilder.build());
   }
 
-  /** Creates an {@link ActionConfig} from a {@link SkylarkInfo}. */
+  /** Creates an {@link ActionConfig} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static ActionConfig actionConfigFromSkylark(SkylarkInfo actionConfigStruct) throws EvalException {
+  static ActionConfig actionConfigFromSkylark(StarlarkInfo actionConfigStruct)
+      throws EvalException {
     checkRightProviderType(actionConfigStruct, "action_config");
     String actionName =
         getMandatoryFieldFromSkylarkProvider(actionConfigStruct, "action_name", String.class);
@@ -1350,16 +1353,16 @@
         getMandatoryFieldFromSkylarkProvider(actionConfigStruct, "enabled", Boolean.class);
 
     ImmutableList.Builder<CcToolchainFeatures.Tool> toolBuilder = ImmutableList.builder();
-    ImmutableList<SkylarkInfo> toolStructs =
+    ImmutableList<StarlarkInfo> toolStructs =
         getSkylarkProviderListFromSkylarkField(actionConfigStruct, "tools");
-    for (SkylarkInfo toolStruct : toolStructs) {
+    for (StarlarkInfo toolStruct : toolStructs) {
       toolBuilder.add(toolFromSkylark(toolStruct));
     }
 
     ImmutableList.Builder<FlagSet> flagSetBuilder = ImmutableList.builder();
-    ImmutableList<SkylarkInfo> flagSets =
+    ImmutableList<StarlarkInfo> flagSets =
         getSkylarkProviderListFromSkylarkField(actionConfigStruct, "flag_sets");
-    for (SkylarkInfo flagSet : flagSets) {
+    for (StarlarkInfo flagSet : flagSets) {
       flagSetBuilder.add(flagSetFromSkylark(flagSet, actionName));
     }
 
@@ -1370,9 +1373,9 @@
         actionName, actionName, toolBuilder.build(), flagSetBuilder.build(), enabled, implies);
   }
 
-  /** Creates an {@link ArtifactNamePattern} from a {@link SkylarkInfo}. */
+  /** Creates an {@link ArtifactNamePattern} from a {@link StarlarkInfo}. */
   @VisibleForTesting
-  static ArtifactNamePattern artifactNamePatternFromSkylark(SkylarkInfo artifactNamePatternStruct)
+  static ArtifactNamePattern artifactNamePatternFromSkylark(StarlarkInfo artifactNamePatternStruct)
       throws EvalException {
     checkRightProviderType(artifactNamePatternStruct, "artifact_name_pattern");
     String categoryName =
@@ -1419,17 +1422,17 @@
   }
 
   private static <T> T getOptionalFieldFromSkylarkProvider(
-      SkylarkInfo provider, String fieldName, Class<T> clazz) throws EvalException {
+      StarlarkInfo provider, String fieldName, Class<T> clazz) throws EvalException {
     return getFieldFromSkylarkProvider(provider, fieldName, clazz, false);
   }
 
   private static <T> T getMandatoryFieldFromSkylarkProvider(
-      SkylarkInfo provider, String fieldName, Class<T> clazz) throws EvalException {
+      StarlarkInfo provider, String fieldName, Class<T> clazz) throws EvalException {
     return getFieldFromSkylarkProvider(provider, fieldName, clazz, true);
   }
 
   private static <T> T getFieldFromSkylarkProvider(
-      SkylarkInfo provider, String fieldName, Class<T> clazz, boolean mandatory)
+      StarlarkInfo provider, String fieldName, Class<T> clazz, boolean mandatory)
       throws EvalException {
     Object obj = provider.getValue(fieldName);
     if (obj == null) {
@@ -1450,31 +1453,31 @@
         String.format("Field '%s' is not of '%s' type.", fieldName, clazz.getName()));
   }
 
-  /** Returns a list of strings from a field of a {@link SkylarkInfo}. */
+  /** Returns a list of strings from a field of a {@link StarlarkInfo}. */
   private static ImmutableList<String> getStringListFromSkylarkProviderField(
-      SkylarkInfo provider, String fieldName) throws EvalException {
+      StarlarkInfo provider, String fieldName) throws EvalException {
     Object v = getValueOrNull(provider, fieldName);
     return v == null
         ? ImmutableList.of()
         : ImmutableList.copyOf(Sequence.noneableCast(v, String.class, fieldName));
   }
 
-  /** Returns a set of strings from a field of a {@link SkylarkInfo}. */
+  /** Returns a set of strings from a field of a {@link StarlarkInfo}. */
   private static ImmutableSet<String> getStringSetFromSkylarkProviderField(
-      SkylarkInfo provider, String fieldName) throws EvalException {
+      StarlarkInfo provider, String fieldName) throws EvalException {
     Object v = getValueOrNull(provider, fieldName);
     return v == null
         ? ImmutableSet.of()
         : ImmutableSet.copyOf(Sequence.noneableCast(v, String.class, fieldName));
   }
 
-  /** Returns a list of SkylarkInfo providers from a field of a {@link SkylarkInfo}. */
-  private static ImmutableList<SkylarkInfo> getSkylarkProviderListFromSkylarkField(
-      SkylarkInfo provider, String fieldName) throws EvalException {
+  /** Returns a list of SkylarkInfo providers from a field of a {@link StarlarkInfo}. */
+  private static ImmutableList<StarlarkInfo> getSkylarkProviderListFromSkylarkField(
+      StarlarkInfo provider, String fieldName) throws EvalException {
     Object v = getValueOrNull(provider, fieldName);
     return v == null
         ? ImmutableList.of()
-        : ImmutableList.copyOf(Sequence.noneableCast(v, SkylarkInfo.class, fieldName));
+        : ImmutableList.copyOf(Sequence.noneableCast(v, StarlarkInfo.class, fieldName));
   }
 
   private static void getLegacyArtifactNamePatterns(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkApiProvider.java
index 1cc1fcb..d4df5a5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcStarlarkApiProvider.java
@@ -38,7 +38,7 @@
 
   public static void maybeAdd(RuleContext ruleContext, RuleConfiguredTargetBuilder builder) {
     if (ruleContext.getFragment(CppConfiguration.class).enableLegacyCcProvider()) {
-      builder.addSkylarkTransitiveInfo(NAME, new CcStarlarkApiProvider());
+      builder.addStarlarkTransitiveInfo(NAME, new CcStarlarkApiProvider());
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index dee7a1d..d46c059 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -482,7 +482,7 @@
     return builder
         .setFilesToBuild(filesToBuild)
         .addNativeDeclaredProvider(javaInfo)
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .add(RunfilesProvider.class, runfilesProvider)
         // The executable to run (below) may be different from the executable for runfiles (the one
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index 465ca38..d427a8a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -153,7 +153,7 @@
 
     return ruleBuilder
         .setFilesToBuild(filesToBuild)
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .add(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index e9a2bd5d..5b99dcc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -195,7 +195,7 @@
             .build();
 
     builder
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addProvider(
             RunfilesProvider.simple(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
index 59cccc0..ed26596 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
@@ -168,7 +168,7 @@
             semantics);
     RuleConfiguredTargetBuilder builder =
         new RuleConfiguredTargetBuilder(ruleContext)
-            .addSkylarkTransitiveInfo(JavaToolchainProvider.LEGACY_NAME, provider)
+            .addStarlarkTransitiveInfo(JavaToolchainProvider.LEGACY_NAME, provider)
             .addNativeDeclaredProvider(provider)
             .addProvider(RunfilesProvider.class, RunfilesProvider.simple(Runfiles.EMPTY))
             .setFilesToBuild(new NestedSetBuilder<Artifact>(Order.STABLE_ORDER).build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index bd941ba..32b4c4d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -104,7 +104,7 @@
 
     return new RuleConfiguredTargetBuilder(ruleContext)
         .setFilesToBuild(filesToBuild.build())
-        .addSkylarkTransitiveInfo(
+        .addStarlarkTransitiveInfo(
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
         .addOutputGroup(OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
index 69a4332..017143b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
@@ -99,7 +99,7 @@
     RuleConfiguredTargetBuilder result =
         new RuleConfiguredTargetBuilder(ruleContext)
             .setFilesToBuild(filesToBuild.build())
-            .addSkylarkTransitiveInfo(
+            .addStarlarkTransitiveInfo(
                 JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
             .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
             .addOutputGroup(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
index 90a1e9e..51ef2fa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
@@ -367,7 +367,7 @@
 
     if (appleConfiguration.shouldLinkingRulesPropagateObjc() && objcProvider != null) {
       targetBuilder.addNativeDeclaredProvider(objcProvider);
-      targetBuilder.addSkylarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider);
+      targetBuilder.addStarlarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider);
     }
 
     InstrumentedFilesInfo instrumentedFilesProvider =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
index 3eabadb..e6a4bba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
@@ -28,8 +28,8 @@
 import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.StarlarkAspect;
+import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform;
@@ -281,6 +281,6 @@
             "binary_provider", output.getBinaryInfoProvider(),
             "debug_outputs_provider", output.getDebugOutputsProvider(),
             "output_groups", Dict.copyOf(thread.mutability(), outputGroups));
-    return SkylarkInfo.create(constructor, fields, Location.BUILTIN);
+    return StarlarkInfo.create(constructor, fields, Location.BUILTIN);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
index 87582fd..8ce28e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
@@ -197,7 +197,7 @@
 
     if (appleConfiguration.shouldLinkingRulesPropagateObjc()) {
       targetBuilder.addNativeDeclaredProvider(objcProvider);
-      targetBuilder.addSkylarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider);
+      targetBuilder.addStarlarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider);
     }
 
     targetBuilder
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
index c7e282d..3f4c82a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
@@ -113,7 +113,7 @@
             CcInfo.builder()
                 .setCcCompilationContext(objcProvider.getCcCompilationContext())
                 .build())
-        .addSkylarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
+        .addStarlarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
index d402cb6..205785f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java
@@ -72,7 +72,7 @@
             CcInfo.builder()
                 .setCcCompilationContext(objcProvider.getCcCompilationContext())
                 .build())
-        .addSkylarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
+        .addStarlarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
         .build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 1104d4c..c5438f6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -104,7 +104,7 @@
 
     return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
         .addNativeDeclaredProvider(objcProvider)
-        .addSkylarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
+        .addStarlarkTransitiveInfo(ObjcProvider.SKYLARK_NAME, objcProvider)
         .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
         .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
         .addNativeDeclaredProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 4f0ef1f..27abe35 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
-import com.google.devtools.build.lib.packages.NativeProvider.WithLegacySkylarkName;
+import com.google.devtools.build.lib.packages.NativeProvider.WithLegacyStarlarkName;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcLinkingContext;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
@@ -1307,13 +1307,13 @@
   }
 
   private static class Constructor extends BuiltinProvider<ObjcProvider>
-      implements WithLegacySkylarkName {
+      implements WithLegacyStarlarkName {
     public Constructor() {
       super(ObjcProvider.SKYLARK_NAME, ObjcProvider.class);
     }
 
     @Override
-    public String getSkylarkName() {
+    public String getStarlarkName() {
       return SKYLARK_NAME;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
index 50995e0..4947a2e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
@@ -225,7 +225,7 @@
         RuleConfiguredTargetBuilder targetBuilder) {
       targetBuilder.addNativeDeclaredProvider(modernBuilder.build());
       if (createLegacy) {
-        targetBuilder.addSkylarkTransitiveInfo(PyStructUtils.PROVIDER_NAME, legacyBuilder.build());
+        targetBuilder.addStarlarkTransitiveInfo(PyStructUtils.PROVIDER_NAME, legacyBuilder.build());
       }
       return targetBuilder;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
index 6c642c5..b142d56 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.StarlarkProviderValidationUtil;
-import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleConfiguredTargetUtil;
+import com.google.devtools.build.lib.analysis.skylark.StarlarkRuleConfiguredTargetUtil;
 import com.google.devtools.build.lib.analysis.skylark.StarlarkRuleContext;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
@@ -184,7 +184,7 @@
         Dict.cast(outputGroups, String.class, StarlarkValue.class, "output_groups").entrySet()) {
       builder.addOutputGroup(
           entry.getKey(),
-          SkylarkRuleConfiguredTargetUtil.convertToOutputGroupValue(
+          StarlarkRuleConfiguredTargetUtil.convertToOutputGroupValue(
               entry.getKey(), entry.getValue()));
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
index 59cc2d4..6b04fa6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache;
 import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
 import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
-import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryFunction;
+import com.google.devtools.build.lib.bazel.repository.skylark.StarlarkRepositoryFunction;
 import com.google.devtools.build.lib.bazel.rules.BazelRulesModule;
 import com.google.devtools.build.lib.packages.BuildFileName;
 import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension;
@@ -118,7 +118,7 @@
                   SkyFunctions.REPOSITORY_DIRECTORY,
                   new RepositoryDelegatorFunction(
                       BazelRepositoryModule.repositoryRules(),
-                      new SkylarkRepositoryFunction(downloadManager),
+                      new StarlarkRepositoryFunction(downloadManager),
                       isFetch,
                       ImmutableMap::of,
                       directories,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkExecutionResultApi.java
similarity index 96%
rename from src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java
rename to src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkExecutionResultApi.java
index 3eda9b6..9a9a4c3 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkExecutionResultApi.java
@@ -31,7 +31,7 @@
         "A structure storing result of repository_ctx.execute() method. It contains the standard"
             + " output stream content, the standard error stream content and the execution return"
             + " code.")
-public interface SkylarkExecutionResultApi extends StarlarkValue {
+public interface StarlarkExecutionResultApi extends StarlarkValue {
   @SkylarkCallable(
       name = "return_code",
       structField = true,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkOSApi.java
similarity index 96%
rename from src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java
rename to src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkOSApi.java
index 2fdd4a5..8123e68 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkOSApi.java
@@ -25,7 +25,7 @@
     name = "repository_os",
     category = StarlarkDocumentationCategory.BUILTIN,
     doc = "Various data about the current platform Bazel is running on.")
-public interface SkylarkOSApi extends StarlarkValue {
+public interface StarlarkOSApi extends StarlarkValue {
   @SkylarkCallable(name = "environ", structField = true, doc = "The list of environment variables.")
   ImmutableMap<String, String> getEnvironmentVariables();
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkRepositoryContextApi.java
similarity index 99%
rename from src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
rename to src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkRepositoryContextApi.java
index 04ca63d..ea155ff 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/StarlarkRepositoryContextApi.java
@@ -36,7 +36,7 @@
             + " helper functions and information about attributes. You get a repository_ctx object"
             + " as an argument to the <code>implementation</code> function when you create a"
             + " repository rule.")
-public interface SkylarkRepositoryContextApi<RepositoryFunctionExceptionT extends Throwable>
+public interface StarlarkRepositoryContextApi<RepositoryFunctionExceptionT extends Throwable>
     extends StarlarkValue {
 
   @SkylarkCallable(
@@ -216,7 +216,7 @@
       name = "os",
       structField = true,
       doc = "A struct to access information from the system.")
-  SkylarkOSApi getOS();
+  StarlarkOSApi getOS();
 
   @SkylarkCallable(
       name = "execute",
@@ -261,7 +261,7 @@
                 "Working directory for command execution.\n"
                     + "Can be relative to the repository root or absolute."),
       })
-  SkylarkExecutionResultApi execute(
+  StarlarkExecutionResultApi execute(
       Sequence<?> arguments,
       Integer timeout,
       Dict<?, ?> environment, // <String, String> expected
