Remove the unnecessary `BuildConfigurationValue` wrapper around `BuildConfiguration`.

Instead, have `BuildConfiguration` implement `SkyValue` directly, and rename it to `BuildConfigurationValue`. Its `equals` and `hashCode` methods are removed - they were incomplete (notably, they did not consider the repository name). This was covered up by the fact that the wrapping `SkyValue` did not implement equality, preventing false change pruning.

`BuildConfigurationValue.Key` is promoted to a top-level class `BuildConfigurationKey`.

PiperOrigin-RevId: 406166220
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index ccf94eb..4606aad 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -308,7 +308,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:action_execution_inactivity_watchdog",
         "//src/main/java/com/google/devtools/build/lib/skyframe:actiongraph/v2/aquery_output_handler",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_key_creator",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe:builder",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configuration_phase_started_event",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Action.java b/src/main/java/com/google/devtools/build/lib/actions/Action.java
index 1a4adb1..b286e9d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Action.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Action.java
@@ -65,10 +65,10 @@
  *   <li>As much as possible, make the cache key computation obvious - fully hash every field
  *       (except input contents, but including input and output names if they appear in the command
  *       line) in the class, and avoid referencing anything that isn't needed for action execution,
- *       such as {@link com.google.devtools.build.lib.analysis.config.BuildConfiguration} objects or
- *       even fragments thereof; if the action has a command line, err on the side of hashing the
- *       entire command line, even if that seems expensive. It's always safe to hash too much - the
- *       negative effect on incremental build times is usually negligible.
+ *       such as {@link com.google.devtools.build.lib.analysis.config.BuildConfigurationValue}
+ *       objects or even fragments thereof; if the action has a command line, err on the side of
+ *       hashing the entire command line, even if that seems expensive. It's always safe to hash too
+ *       much - the negative effect on incremental build times is usually negligible.
  *   <li>Add test coverage for the cache key computation; use {@link
  *       com.google.devtools.build.lib.analysis.util.ActionTester} to generate as many combinations
  *       of field values as possible; add test coverage every time you add another field.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInput.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInput.java
index 88a3f2e..573326a 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionInput.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInput.java
@@ -46,7 +46,7 @@
 
   /**
    * Returns if this input's file system path includes a digest of its content. See {@link
-   * com.google.devtools.build.lib.analysis.config.BuildConfiguration#useContentBasedOutputPaths}.
+   * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue#useContentBasedOutputPaths}.
    */
   default boolean contentBasedPath() {
     return false;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index e6c55fe..e5e927c 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -383,7 +383,7 @@
     /**
      * Content-based output paths are experimental. Only derived artifacts that are explicitly opted
      * in by their creating rules should use them and only when {@link
-     * com.google.devtools.build.lib.analysis.config.BuildConfiguration#useContentBasedOutputPaths}
+     * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue#useContentBasedOutputPaths}
      * is on.
      */
     private final boolean contentBasedPath;
@@ -397,7 +397,7 @@
     /**
      * Same as {@link #create(ArtifactRoot, PathFragment, ActionLookupKey)} but includes the option
      * to use a content-based path for this artifact (see {@link
-     * com.google.devtools.build.lib.analysis.config.BuildConfiguration#useContentBasedOutputPaths}).
+     * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue#useContentBasedOutputPaths}).
      */
     public static DerivedArtifact create(
         ArtifactRoot root, PathFragment execPath, ActionLookupKey owner, boolean contentBasedPath) {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
index 8cd3a5f..6c53018 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
@@ -216,7 +216,7 @@
   /**
    * Same as {@link #getDerivedArtifact(PathFragment, ArtifactRoot, ArtifactOwner)} but includes the
    * option to use a content-based path for this artifact (see {@link
-   * com.google.devtools.build.lib.analysis.config.BuildConfiguration#useContentBasedOutputPaths}).
+   * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue#useContentBasedOutputPaths}).
    */
   public Artifact.DerivedArtifact getDerivedArtifact(
       PathFragment rootRelativePath,
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java
index d072222..af4234e 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java
@@ -25,7 +25,7 @@
 
 /**
  * Encapsulation of {@link BuildEvent} info associated with a {@link
- * com.google.devtools.build.lib.analysis.config.BuildConfiguration}.
+ * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue}.
  */
 @AutoCodec
 public class BuildConfigurationEvent implements BuildEvent {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index 300fe53..a13e10f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.actions.MiddlemanFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
@@ -67,7 +67,7 @@
   /**
    * Same as {@link #getDerivedArtifact(PathFragment, ArtifactRoot)} but includes the option to use
    * a content-based path for this artifact (see {@link
-   * BuildConfiguration#useContentBasedOutputPaths()}).
+   * BuildConfigurationValue#useContentBasedOutputPaths()}).
    */
   Artifact.DerivedArtifact getDerivedArtifact(
       PathFragment rootRelativePath, ArtifactRoot root, boolean contentBasedPath);
@@ -178,8 +178,8 @@
    * @param stamp whether stamping is enabled
    * @param config the current build configuration.
    */
-  ImmutableList<Artifact> getBuildInfo(boolean stamp, BuildInfoKey key, BuildConfiguration config)
-      throws InterruptedException;
+  ImmutableList<Artifact> getBuildInfo(
+      boolean stamp, BuildInfoKey key, BuildConfigurationValue config) throws InterruptedException;
 
   /**
    * Returns the set of orphan Artifacts (i.e. Artifacts without generating action). Should only be
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisOptions.java
index a02d4ce..0938064 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisOptions.java
@@ -25,7 +25,7 @@
 /**
  * Options that affect the <i>mechanism</i> of analysis. These are distinct from {@link
  * com.google.devtools.build.lib.analysis.config.BuildOptions}, which affect the <i>value</i> of a
- * BuildConfiguration.
+ * BuildConfigurationValue.
  */
 public class AnalysisOptions extends OptionsBase {
   @Option(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java
index 7be2f31..a796ea9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventContext;
 import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil;
@@ -35,12 +35,12 @@
  * cause. It also allows UIs to collate errors by root cause.
  */
 public class AnalysisRootCauseEvent implements BuildEventWithConfiguration {
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private final Label label;
   private final String errorMessage;
 
   public AnalysisRootCauseEvent(
-      @Nullable BuildConfiguration configuration, Label label, String errorMessage) {
+      @Nullable BuildConfigurationValue configuration, Label label, String errorMessage) {
     this.configuration = configuration;
     this.label = label;
     this.errorMessage = errorMessage;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index 872956f..9f79dc3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -19,8 +19,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Multimap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver.TopLevelTargetsAndConfigsResult;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
@@ -56,7 +56,7 @@
    * it returns the value of the stamp attribute, or of the stamp option if the attribute value is
    * -1.
    */
-  public static boolean isStampingEnabled(RuleContext ruleContext, BuildConfiguration config) {
+  public static boolean isStampingEnabled(RuleContext ruleContext, BuildConfigurationValue config) {
     if (config.isToolConfiguration()) {
       return false;
     }
@@ -180,7 +180,7 @@
     // We use a hash set here to remove duplicate nodes; this can happen for input files and package
     // groups.
     LinkedHashSet<TargetAndConfiguration> nodes = new LinkedHashSet<>(targets.size());
-    for (BuildConfiguration config : configurations.getTargetConfigurations()) {
+    for (BuildConfigurationValue config : configurations.getTargetConfigurations()) {
       for (Target target : targets) {
         nodes.add(new TargetAndConfiguration(target, config));
       }
@@ -188,16 +188,17 @@
 
     // We'll get the configs from ConfigurationsCollector#getConfigurations, which gets
     // configurations for deps including transitions.
-    Multimap<BuildConfiguration, DependencyKey> asDeps = targetsToDeps(nodes, ruleClassProvider);
+    Multimap<BuildConfigurationValue, DependencyKey> asDeps =
+        targetsToDeps(nodes, ruleClassProvider);
 
     return ConfigurationResolver.getConfigurationsFromExecutor(
         nodes, asDeps, eventHandler, configurationsCollector);
   }
 
   @VisibleForTesting
-  public static Multimap<BuildConfiguration, DependencyKey> targetsToDeps(
+  public static Multimap<BuildConfigurationValue, DependencyKey> targetsToDeps(
       Collection<TargetAndConfiguration> nodes, ConfiguredRuleClassProvider ruleClassProvider) {
-    Multimap<BuildConfiguration, DependencyKey> asDeps = ArrayListMultimap.create();
+    Multimap<BuildConfigurationValue, DependencyKey> asDeps = ArrayListMultimap.create();
     for (TargetAndConfiguration targetAndConfig : nodes) {
       ConfigurationTransition transition =
           TransitionResolver.evaluateTransition(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
index f5796fa..740a074 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventContext;
 import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil;
@@ -30,10 +30,10 @@
 public class AspectConfiguredEvent implements BuildEventWithConfiguration {
   private final Label target;
   private final String aspect;
-  private final Collection<BuildConfiguration> configurations;
+  private final Collection<BuildConfigurationValue> configurations;
 
   AspectConfiguredEvent(
-      Label target, String aspect, Collection<BuildConfiguration> configurations) {
+      Label target, String aspect, Collection<BuildConfigurationValue> configurations) {
     this.configurations = configurations;
     this.target = target;
     this.aspect = aspect;
@@ -42,7 +42,7 @@
   @Override
   public Collection<BuildEvent> getConfigurations() {
     ImmutableList.Builder<BuildEvent> builder = new ImmutableList.Builder<>();
-    for (BuildConfiguration config : configurations) {
+    for (BuildConfigurationValue config : configurations) {
       if (config != null) {
         builder.add(config.toBuildEvent());
       } else {
@@ -60,7 +60,7 @@
   @Override
   public Collection<BuildEventId> getChildrenEvents() {
     ImmutableList.Builder<BuildEventId> childrenBuilder = ImmutableList.builder();
-    for (BuildConfiguration config : configurations) {
+    for (BuildConfigurationValue config : configurations) {
       if (config != null) {
         childrenBuilder.add(BuildEventIdUtil.targetCompleted(target, config.getEventId()));
       } else {
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 9a29547..4098ab5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -408,7 +408,7 @@
         "//src/main/java/com/google/devtools/build/lib/shell",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_creation_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_key_creator",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe:build_info_collection_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_and_data",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
@@ -614,7 +614,7 @@
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
         "//src/main/java/com/google/devtools/build/lib/profiler",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_key_creator",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
         "//src/main/java/com/google/devtools/build/lib/skyframe:coverage_report_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
@@ -683,7 +683,7 @@
         ":config/config_matching_provider",
         ":transitive_info_collection",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -1512,7 +1512,7 @@
 java_library(
     name = "config/build_configuration",
     srcs = [
-        "config/BuildConfiguration.java",
+        "config/BuildConfigurationValue.java",
         "config/OutputDirectories.java",
     ],
     deps = [
@@ -1533,12 +1533,14 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/events",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:os",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/net/starlark/java/annot",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:guava",
@@ -2072,7 +2074,7 @@
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:auto_value",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
index 861206b..1b7fb7e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
@@ -29,7 +29,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.analysis.config.RunUnder;
 import com.google.devtools.build.lib.analysis.constraints.ConstraintConstants;
@@ -121,7 +121,7 @@
   @SerializationConstant @AutoCodec.VisibleForSerialization @VisibleForTesting
   static final LabelListLateBoundDefault<?> ACTION_LISTENER =
       LabelListLateBoundDefault.fromTargetConfiguration(
-          BuildConfiguration.class,
+          BuildConfigurationValue.class,
           (rule, attributes, configuration) -> configuration.getActionListeners());
 
   public static final String DEFAULT_COVERAGE_SUPPORT_VALUE = "//tools/test:coverage_support";
@@ -152,13 +152,13 @@
         TestConfiguration.class, defaultValue, COVERAGE_REPORT_GENERATOR_CONFIGURATION_RESOLVER);
   }
 
-  public static LabelLateBoundDefault<BuildConfiguration> getCoverageOutputGeneratorLabel() {
+  public static LabelLateBoundDefault<BuildConfigurationValue> getCoverageOutputGeneratorLabel() {
     return LabelLateBoundDefault.fromTargetConfiguration(
-        BuildConfiguration.class, null, COVERAGE_OUTPUT_GENERATOR_RESOLVER);
+        BuildConfigurationValue.class, null, COVERAGE_OUTPUT_GENERATOR_RESOLVER);
   }
 
   @SerializationConstant @AutoCodec.VisibleForSerialization
-  static final Resolver<BuildConfiguration, Label> COVERAGE_OUTPUT_GENERATOR_RESOLVER =
+  static final Resolver<BuildConfigurationValue, Label> COVERAGE_OUTPUT_GENERATOR_RESOLVER =
       (rule, attributes, configuration) -> {
         if (configuration.isCodeCoverageEnabled()) {
           return Label.parseAbsoluteUnchecked(DEFAULT_COVERAGE_OUTPUT_GENERATOR_VALUE);
@@ -172,7 +172,7 @@
   @SerializationConstant @AutoCodec.VisibleForSerialization
   public static final LabelLateBoundDefault<?> RUN_UNDER =
       LabelLateBoundDefault.fromTargetConfiguration(
-          BuildConfiguration.class,
+          BuildConfigurationValue.class,
           null,
           (rule, attributes, configuration) -> {
             RunUnder runUnder = configuration.getRunUnder();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index ea261a9..749a8d0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -36,8 +36,8 @@
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.PackageRoots;
 import com.google.devtools.build.lib.actions.TotalAndConfiguredTargetOnlyMetric;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver.TopLevelTargetsAndConfigsResult;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
@@ -75,7 +75,7 @@
 import com.google.devtools.build.lib.skyframe.AspectKeyCreator;
 import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey;
 import com.google.devtools.build.lib.skyframe.AspectKeyCreator.TopLevelAspectsKey;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.CoverageReportValue;
 import com.google.devtools.build.lib.skyframe.PrepareAnalysisPhaseValue;
@@ -117,7 +117,7 @@
  * build.
  *
  * <p>Targets are implemented by the {@link Target} hierarchy in the {@code lib.packages} code.
- * Configurations are implemented by {@link BuildConfiguration}. The pair of these together is
+ * Configurations are implemented by {@link BuildConfigurationValue}. The pair of these together is
  * represented by an instance of class {@link ConfiguredTarget}; this is the root of a hierarchy
  * with different implementations for each kind of target: source file, derived file, rules, etc.
  *
@@ -255,7 +255,7 @@
           new MakeEnvironmentEvent(
               configurations.getTargetConfigurations().get(0).getMakeEnvironment()));
     }
-    for (BuildConfiguration targetConfig : configurations.getTargetConfigurations()) {
+    for (BuildConfigurationValue targetConfig : configurations.getTargetConfigurations()) {
       eventBus.post(targetConfig.toBuildEvent());
     }
 
@@ -263,7 +263,7 @@
         topLevelTargetsWithConfigsResult.getTargetsAndConfigs();
 
     // Report the generated association of targets to configurations
-    Multimap<Label, BuildConfiguration> byLabel = ArrayListMultimap.create();
+    Multimap<Label, BuildConfigurationValue> byLabel = ArrayListMultimap.create();
     for (TargetAndConfiguration pair : topLevelTargetsWithConfigs) {
       byLabel.put(pair.getLabel(), pair.getConfiguration());
     }
@@ -332,12 +332,12 @@
       }
     }
 
-    Multimap<Pair<Label, String>, BuildConfiguration> aspectConfigurations =
+    Multimap<Pair<Label, String>, BuildConfigurationValue> aspectConfigurations =
         ArrayListMultimap.create();
     ImmutableList<AspectClass> aspectClasses = aspectClassesBuilder.build();
     ImmutableList.Builder<TopLevelAspectsKey> aspectsKeys = ImmutableList.builder();
     for (TargetAndConfiguration targetSpec : topLevelTargetsWithConfigs) {
-      BuildConfiguration configuration = targetSpec.getConfiguration();
+      BuildConfigurationValue configuration = targetSpec.getConfiguration();
       for (AspectClass aspectClass : aspectClasses) {
         aspectConfigurations.put(
             Pair.of(targetSpec.getLabel(), aspectClass.getName()), configuration);
@@ -360,13 +360,12 @@
     getArtifactFactory().noteAnalysisStarting();
     SkyframeAnalysisResult skyframeAnalysisResult;
     try {
-      Supplier<Map<BuildConfigurationValue.Key, BuildConfiguration>> configurationLookupSupplier =
+      Supplier<Map<BuildConfigurationKey, BuildConfigurationValue>> configurationLookupSupplier =
           () -> {
-            Map<BuildConfigurationValue.Key, BuildConfiguration> result = new HashMap<>();
+            Map<BuildConfigurationKey, BuildConfigurationValue> result = new HashMap<>();
             for (TargetAndConfiguration node : topLevelTargetsWithConfigs) {
               if (node.getConfiguration() != null) {
-                result.put(
-                    BuildConfigurationValue.key(node.getConfiguration()), node.getConfiguration());
+                result.put(node.getConfiguration().getKey(), node.getConfiguration());
               }
             }
             return result;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index aa53a09..f43bbdf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.actions.MiddlemanFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.packages.Target;
@@ -379,7 +379,7 @@
 
   @Override
   public ImmutableList<Artifact> getBuildInfo(
-      boolean stamp, BuildInfoKey key, BuildConfiguration config) throws InterruptedException {
+      boolean stamp, BuildInfoKey key, BuildConfigurationValue config) throws InterruptedException {
     BuildInfoCollectionValue collectionValue =
         (BuildInfoCollectionValue) skyframeEnv.getValue(BuildInfoCollectionValue.key(key, config));
     if (collectionValue == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
index 2bf73e6..428e764 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
@@ -19,7 +19,7 @@
 import com.google.common.collect.Streams;
 import com.google.devtools.build.lib.analysis.MakeVariableSupplier.MapBackedMakeVariableSupplier;
 import com.google.devtools.build.lib.analysis.MakeVariableSupplier.TemplateVariableInfoBackedMakeVariableSupplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.stringtemplate.ExpansionException;
 import com.google.devtools.build.lib.analysis.stringtemplate.TemplateContext;
 import com.google.devtools.build.lib.packages.Package;
@@ -68,14 +68,14 @@
       ImmutableList.of("toolchains", ":cc_toolchain", "$toolchains");
 
   public ConfigurationMakeVariableContext(
-      RuleContext ruleContext, Package pkg, BuildConfiguration configuration) {
+      RuleContext ruleContext, Package pkg, BuildConfigurationValue configuration) {
     this(ruleContext, pkg, configuration, ImmutableList.<MakeVariableSupplier>of());
   }
 
   public ConfigurationMakeVariableContext(
       RuleContext ruleContext,
       Package pkg,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Iterable<? extends MakeVariableSupplier> makeVariableSuppliers) {
     this(
         getRuleTemplateVariableProviders(ruleContext, DEFAULT_MAKE_VARIABLE_ATTRIBUTES),
@@ -87,7 +87,7 @@
   private ConfigurationMakeVariableContext(
       ImmutableList<TemplateVariableInfo> ruleTemplateVariableProviders,
       Package pkg,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Iterable<? extends MakeVariableSupplier> extraMakeVariableSuppliers) {
     this.allMakeVariableSuppliers =
         ImmutableList.<MakeVariableSupplier>builder()
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java
index 2916733..666c109 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationsResult.java
@@ -15,7 +15,7 @@
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 
@@ -24,11 +24,11 @@
  * registers if an error was recorded.
  */
 public class ConfigurationsResult {
-  private final Multimap<DependencyKey, BuildConfiguration> configurations;
+  private final Multimap<DependencyKey, BuildConfigurationValue> configurations;
   private final boolean hasError;
 
   private ConfigurationsResult(
-      Multimap<DependencyKey, BuildConfiguration> configurations, boolean hasError) {
+      Multimap<DependencyKey, BuildConfigurationValue> configurations, boolean hasError) {
     this.configurations = configurations;
     this.hasError = hasError;
   }
@@ -37,7 +37,7 @@
     return hasError;
   }
 
-  public Multimap<DependencyKey, BuildConfiguration> getConfigurationMap() {
+  public Multimap<DependencyKey, BuildConfigurationValue> getConfigurationMap() {
     return configurations;
   }
 
@@ -47,11 +47,11 @@
 
   /** Builder for {@link ConfigurationsResult} */
   public static class Builder {
-    private final Multimap<DependencyKey, BuildConfiguration> configurations =
+    private final Multimap<DependencyKey, BuildConfigurationValue> configurations =
         ArrayListMultimap.create();
     private boolean hasError = false;
 
-    public void put(DependencyKey key, BuildConfiguration value) {
+    public void put(DependencyKey key, BuildConfigurationValue value) {
       configurations.put(key, value);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 150a8d3..bee3bc7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext.PrerequisiteValidator;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
@@ -158,7 +158,7 @@
     private final ImmutableList.Builder<SymlinkDefinition> symlinkDefinitions =
         ImmutableList.builder();
     private final Set<String> reservedActionMnemonics = new TreeSet<>();
-    private BuildConfiguration.ActionEnvironmentProvider actionEnvironmentProvider =
+    private BuildConfigurationValue.ActionEnvironmentProvider actionEnvironmentProvider =
         (BuildOptions options) -> ActionEnvironment.EMPTY;
     private ConstraintSemantics<RuleContext> constraintSemantics =
         new RuleContextConstraintSemantics();
@@ -327,7 +327,7 @@
     }
 
     public Builder setActionEnvironmentProvider(
-        BuildConfiguration.ActionEnvironmentProvider actionEnvironmentProvider) {
+        BuildConfigurationValue.ActionEnvironmentProvider actionEnvironmentProvider) {
       this.actionEnvironmentProvider = actionEnvironmentProvider;
       return this;
     }
@@ -649,7 +649,7 @@
 
   private final ImmutableSet<String> reservedActionMnemonics;
 
-  private final BuildConfiguration.ActionEnvironmentProvider actionEnvironmentProvider;
+  private final BuildConfigurationValue.ActionEnvironmentProvider actionEnvironmentProvider;
 
   private final ImmutableMap<String, Class<?>> configurationFragmentMap;
 
@@ -682,7 +682,7 @@
       ImmutableList<Bootstrap> starlarkBootstraps,
       ImmutableList<SymlinkDefinition> symlinkDefinitions,
       ImmutableSet<String> reservedActionMnemonics,
-      BuildConfiguration.ActionEnvironmentProvider actionEnvironmentProvider,
+      BuildConfigurationValue.ActionEnvironmentProvider actionEnvironmentProvider,
       ConstraintSemantics<RuleContext> constraintSemantics,
       ThirdPartyLicenseExistencePolicy thirdPartyLicenseExistencePolicy,
       @Nullable Label networkAllowlistForTests) {
@@ -914,7 +914,7 @@
     return reservedActionMnemonics;
   }
 
-  public BuildConfiguration.ActionEnvironmentProvider getActionEnvironmentProvider() {
+  public BuildConfigurationValue.ActionEnvironmentProvider getActionEnvironmentProvider() {
     return actionEnvironmentProvider;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java
index b01b14f..c8c600a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java
@@ -18,14 +18,15 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import javax.annotation.Nullable;
 import net.starlark.java.eval.Structure;
 
 /**
  * A {@link ConfiguredTarget} is conceptually a {@link TransitiveInfoCollection} coupled with the
  * {@link com.google.devtools.build.lib.packages.Target} and {@link
- * com.google.devtools.build.lib.analysis.config.BuildConfiguration} objects it was created from.
+ * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue} objects it was created
+ * from.
  *
  * <p>This interface is supposed to only be used in {@link BuildView} and above. In particular, rule
  * implementations should not be able to access the {@link ConfiguredTarget} objects associated with
@@ -46,15 +47,16 @@
   }
 
   /**
-   * Returns the {@link BuildConfigurationValue.Key} naming the {@link
-   * com.google.devtools.build.lib.analysis.config.BuildConfiguration} for which this configured
-   * target is defined. Configuration is defined for all configured targets with exception of {@link
+   * Returns the {@link BuildConfigurationKey} naming the {@link
+   * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue} for which this
+   * configured target is defined. Configuration is defined for all configured targets with
+   * exception of {@link
    * com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget} and {@link
    * com.google.devtools.build.lib.analysis.configuredtargets.PackageGroupConfiguredTarget} for
    * which it is always <b>null</b>.
    */
   @Nullable
-  BuildConfigurationValue.Key getConfigurationKey();
+  BuildConfigurationKey getConfigurationKey();
 
   /** Returns keys for a legacy Starlark provider. */
   @Override
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 d11739a..a4d52b3 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
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.actions.FailAction;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.ExecGroupCollection.InvalidExecGroupException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigConditions;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.RequiredFragmentsUtil;
@@ -174,8 +174,8 @@
       AnalysisEnvironment analysisEnvironment,
       ArtifactFactory artifactFactory,
       Target target,
-      BuildConfiguration config,
-      BuildConfiguration hostConfig,
+      BuildConfigurationValue config,
+      BuildConfigurationValue hostConfig,
       ConfiguredTargetKey configuredTargetKey,
       OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
       ConfigConditions configConditions,
@@ -275,8 +275,8 @@
   private ConfiguredTarget createRule(
       AnalysisEnvironment env,
       Rule rule,
-      BuildConfiguration configuration,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue configuration,
+      BuildConfigurationValue hostConfiguration,
       ConfiguredTargetKey configuredTargetKey,
       OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
       ConfigConditions configConditions,
@@ -484,8 +484,8 @@
       OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
       ConfigConditions configConditions,
       @Nullable ResolvedToolchainContext toolchainContext,
-      BuildConfiguration aspectConfiguration,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue aspectConfiguration,
+      BuildConfigurationValue hostConfiguration,
       AspectKeyCreator.AspectKey aspectKey)
       throws InterruptedException, ActionConflictException, InvalidExecGroupException {
     RuleContext ruleContext =
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java b/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java
index f958103..25f6257 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Dependency.java
@@ -16,7 +16,7 @@
 import com.google.auto.value.AutoValue;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
@@ -46,7 +46,7 @@
     public abstract Builder setLabel(Label label);
 
     /** Sets the configuration intended for this dependency. */
-    public abstract Builder setConfiguration(BuildConfiguration configuration);
+    public abstract Builder setConfiguration(BuildConfigurationValue configuration);
 
     /** Explicitly set the configuration for this dependency to null. */
     public Builder withNullConfiguration() {
@@ -92,7 +92,7 @@
     protected abstract Label getLabel();
 
     @Nullable
-    protected abstract BuildConfiguration getConfiguration();
+    protected abstract BuildConfigurationValue getConfiguration();
 
     protected abstract AspectCollection getAspects();
 
@@ -120,7 +120,7 @@
 
   /** Returns the explicit configuration intended for this dependency. */
   @Nullable
-  public abstract BuildConfiguration getConfiguration();
+  public abstract BuildConfigurationValue getConfiguration();
 
   /**
    * Returns the set of aspects which should be evaluated and combined with the configured target
@@ -132,7 +132,7 @@
 
   /** Returns the configuration an aspect should be evaluated with. */
   @Nullable
-  public BuildConfiguration getAspectConfiguration(AspectDescriptor aspect) {
+  public BuildConfigurationValue getAspectConfiguration(AspectDescriptor aspect) {
     return getConfiguration();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index 45554ad..6802a6e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.AspectCollection.AspectCycleOnPathException;
 import com.google.devtools.build.lib.analysis.DependencyKind.AttributeDependencyKind;
 import com.google.devtools.build.lib.analysis.DependencyKind.ToolchainDependencyKind;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
@@ -81,7 +81,7 @@
    */
   // TODO(#10523): Remove this when the migration period for toolchain transitions has ended.
   public static boolean shouldUseToolchainTransition(
-      @Nullable BuildConfiguration configuration, Target target) {
+      @Nullable BuildConfigurationValue configuration, Target target) {
     return shouldUseToolchainTransition(
         configuration, target instanceof Rule ? (Rule) target : null);
   }
@@ -92,7 +92,7 @@
    */
   // TODO(#10523): Remove this when the migration period for toolchain transitions has ended.
   public static boolean shouldUseToolchainTransition(
-      @Nullable BuildConfiguration configuration, @Nullable Rule rule) {
+      @Nullable BuildConfigurationValue configuration, @Nullable Rule rule) {
     // Check whether the global incompatible change flag is set.
     if (configuration != null) {
       PlatformOptions platformOptions = configuration.getOptions().get(PlatformOptions.class);
@@ -181,7 +181,7 @@
    */
   public final OrderedSetMultimap<DependencyKind, DependencyKey> dependentNodeMap(
       TargetAndConfiguration node,
-      BuildConfiguration hostConfig,
+      BuildConfigurationValue hostConfig,
       @Nullable Aspect aspect,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
       @Nullable ToolchainCollection<ToolchainContext> toolchainContexts,
@@ -238,7 +238,7 @@
    */
   public final OrderedSetMultimap<DependencyKind, DependencyKey> dependentNodeMap(
       TargetAndConfiguration node,
-      BuildConfiguration hostConfig,
+      BuildConfigurationValue hostConfig,
       Iterable<Aspect> aspects,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
       @Nullable ToolchainCollection<ToolchainContext> toolchainContexts,
@@ -247,7 +247,7 @@
       @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory)
       throws Failure, InterruptedException, InconsistentAspectOrderException {
     Target target = node.getTarget();
-    BuildConfiguration config = node.getConfiguration();
+    BuildConfigurationValue config = node.getConfiguration();
     OrderedSetMultimap<DependencyKind, Label> outgoingLabels = OrderedSetMultimap.create();
 
     // TODO(bazel-team): Figure out a way to implement the below (and partiallyResolveDependencies)
@@ -313,7 +313,7 @@
    */
   private OrderedSetMultimap<DependencyKind, PartiallyResolvedDependency>
       partiallyResolveDependencies(
-          BuildConfiguration config,
+          BuildConfigurationValue config,
           OrderedSetMultimap<DependencyKind, Label> outgoingLabels,
           @Nullable Rule fromRule,
           @Nullable ConfiguredAttributeMapper attributeMap,
@@ -461,7 +461,7 @@
   private OrderedSetMultimap<DependencyKind, DependencyKey> fullyResolveDependencies(
       OrderedSetMultimap<DependencyKind, PartiallyResolvedDependency> partiallyResolvedDeps,
       Map<Label, Target> targetMap,
-      BuildConfiguration originalConfiguration,
+      BuildConfigurationValue originalConfiguration,
       @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory)
       throws InconsistentAspectOrderException {
     OrderedSetMultimap<DependencyKind, DependencyKey> outgoingEdges = OrderedSetMultimap.create();
@@ -514,14 +514,14 @@
 
   private void visitRule(
       TargetAndConfiguration node,
-      BuildConfiguration hostConfig,
+      BuildConfigurationValue hostConfig,
       Iterable<Aspect> aspects,
       ConfiguredAttributeMapper attributeMap,
       @Nullable ToolchainCollection<ToolchainContext> toolchainContexts,
       OrderedSetMultimap<DependencyKind, Label> outgoingLabels)
       throws Failure {
     Preconditions.checkArgument(node.getTarget() instanceof Rule, node);
-    BuildConfiguration ruleConfig = Preconditions.checkNotNull(node.getConfiguration(), node);
+    BuildConfigurationValue ruleConfig = Preconditions.checkNotNull(node.getConfiguration(), node);
     Rule rule = (Rule) node.getTarget();
 
     try {
@@ -589,8 +589,8 @@
       Rule rule,
       ConfiguredAttributeMapper attributeMap,
       Iterable<Aspect> aspects,
-      BuildConfiguration ruleConfig,
-      BuildConfiguration hostConfig) {
+      BuildConfigurationValue ruleConfig,
+      BuildConfigurationValue hostConfig) {
     for (AttributeDependencyKind dependencyKind : getAttributes(rule, aspects)) {
       Attribute attribute = dependencyKind.getAttribute();
       if (!attribute.getCondition().apply(attributeMap)
@@ -634,8 +634,8 @@
       OrderedSetMultimap<DependencyKind, Label> outgoingLabels,
       Rule rule,
       ConfiguredAttributeMapper attributeMap,
-      BuildConfiguration ruleConfig,
-      BuildConfiguration hostConfig) {
+      BuildConfigurationValue ruleConfig,
+      BuildConfigurationValue hostConfig) {
     T attributeValue = null;
     if (attribute.isImplicit()) {
       // Since the attributes that come from aspects do not appear in attributeMap, we have to get
@@ -679,18 +679,18 @@
       Rule rule,
       AttributeMap attributeMap,
       Attribute attribute,
-      BuildConfiguration ruleConfig,
-      BuildConfiguration hostConfig) {
+      BuildConfigurationValue ruleConfig,
+      BuildConfigurationValue hostConfig) {
     Preconditions.checkState(!attribute.getTransitionFactory().isSplit());
     @SuppressWarnings("unchecked")
     LateBoundDefault<FragmentT, ?> lateBoundDefault =
         (LateBoundDefault<FragmentT, ?>) attribute.getLateBoundDefault();
-    BuildConfiguration attributeConfig =
+    BuildConfigurationValue attributeConfig =
         lateBoundDefault.useHostConfiguration() ? hostConfig : ruleConfig;
 
     Class<FragmentT> fragmentClass = lateBoundDefault.getFragmentClass();
     // TODO(b/65746853): remove this when nothing uses it anymore
-    if (BuildConfiguration.class.equals(fragmentClass)) {
+    if (BuildConfigurationValue.class.equals(fragmentClass)) {
       return lateBoundDefault.resolve(rule, attributeMap, fragmentClass.cast(attributeConfig));
     }
     if (Void.class.equals(fragmentClass)) {
@@ -735,7 +735,7 @@
   private static void collectPropagatingAspects(
       ImmutableList<Aspect> aspectsPath,
       String attributeName,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       @Nullable AspectClass aspectOwningAttribute,
       ImmutableList.Builder<Aspect> allFilteredAspects) {
     int aspectsNum = aspectsPath.size();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/EmptyConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/EmptyConfiguredTarget.java
index 798af73..811a731 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/EmptyConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/EmptyConfiguredTarget.java
@@ -21,13 +21,13 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import javax.annotation.Nullable;
 
 /** A configured target that is empty. */
 @Immutable
 public class EmptyConfiguredTarget extends AbstractConfiguredTarget {
-  public EmptyConfiguredTarget(Label label, BuildConfigurationValue.Key configurationKey) {
+  public EmptyConfiguredTarget(Label label, BuildConfigurationKey configurationKey) {
     super(label, configurationKey, NestedSetBuilder.emptySet(Order.STABLE_ORDER));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java b/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java
index ebe3cc2..85f4006 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis;
 
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.Attribute;
@@ -105,7 +105,7 @@
 
   protected abstract Label getLabel();
 
-  protected abstract BuildConfiguration getConfiguration();
+  protected abstract BuildConfigurationValue getConfiguration();
 
   protected abstract Location getRuleLocation();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java
index f8af04d..c846d3f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.Multimap;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.extra.ExtraActionMapProvider;
 import com.google.devtools.build.lib.analysis.extra.ExtraActionSpec;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -41,7 +41,7 @@
   static ExtraActionArtifactsProvider createExtraActionProvider(
       Set<ActionAnalysisMetadata> actionsWithoutExtraAction, RuleContext ruleContext)
       throws InterruptedException {
-    BuildConfiguration configuration = ruleContext.getConfiguration();
+    BuildConfigurationValue configuration = ruleContext.getConfiguration();
     if (configuration.isToolConfiguration()) {
       return ExtraActionArtifactsProvider.EMPTY;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
index d6ced49..dc4de8a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
@@ -26,7 +26,8 @@
    * The set of label - license associations in the transitive closure.
    *
    * <p>Always returns an empty set if {@link
-   * com.google.devtools.build.lib.analysis.config.BuildConfiguration#checkLicenses()} is false.
+   * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue#checkLicenses()} is
+   * false.
    */
   NestedSet<TargetLicense> getTransitiveLicenses();
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java
index 36320ed..98d0876 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.common.collect.ListMultimap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -49,7 +49,7 @@
     }
 
     NestedSetBuilder<TargetLicense> builder = NestedSetBuilder.linkOrder();
-    BuildConfiguration configuration = ruleContext.getConfiguration();
+    BuildConfigurationValue configuration = ruleContext.getConfiguration();
     Rule rule = ruleContext.getRule();
     AttributeMap attributes = ruleContext.attributes();
     License toolOutputLicense = rule.getToolOutputLicense(attributes);
@@ -95,7 +95,8 @@
     return new LicensesProviderImpl(builder.build(), outputLicenses);
   }
 
-  private static boolean useOutputLicenses(Attribute attribute, BuildConfiguration configuration) {
+  private static boolean useOutputLicenses(
+      Attribute attribute, BuildConfigurationValue configuration) {
     return configuration.isToolConfiguration() || attribute.useOutputLicenses();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java
index 759110d..8fc5f99 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java
@@ -14,9 +14,10 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 
 /**
  * A shortcut class to the appropriate specialization of {@code RuleClass.ConfiguredTargetFactory}.
@@ -26,12 +27,11 @@
  * <p>Actions (i.e. commands that are run during the build) are created by configured targets (see
  * {@link ConfiguredTarget}), which are a pair of a {@link
  * com.google.devtools.build.lib.cmdline.Label} (e.g. <code>//src:bazel</code>) and a {@link
- * com.google.devtools.build.lib.skyframe.BuildConfigurationValue.Key}, which is a key for a {@link
- * com.google.devtools.build.lib.analysis.config.BuildConfiguration}, which is a blob of data that
- * contains extra information about how the target should be built (for example, for which platform
- * or with which C++ preprocessor definitions). Accordingly, a target can give rise to multiple
- * configured targets, for example, if it needs to be built both for the host and the target
- * configuration.
+ * BuildConfigurationKey}, which is a key for a {@link BuildConfigurationValue}, which is a blob of
+ * data that contains extra information about how the target should be built (for example, for which
+ * platform or with which C++ preprocessor definitions). Accordingly, a target can give rise to
+ * multiple configured targets, for example, if it needs to be built both for the host and the
+ * target configuration.
  *
  * <p>The process of creating the appropriate {@link com.google.devtools.build.lib.actions.Action}s
  * for a configured target is called "analysis". The analysis of a configured target is composed of
@@ -129,5 +129,5 @@
   default void addRuleImplSpecificRequiredConfigFragments(
       RequiredConfigFragmentsProvider.Builder requiredFragments,
       AttributeMap attributes,
-      BuildConfiguration configuration) {}
+      BuildConfigurationValue configuration) {}
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 88338bd..7e8d23d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -46,7 +46,7 @@
 import com.google.devtools.build.lib.analysis.ExecGroupCollection.InvalidExecGroupException;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigConditions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.config.Fragment;
@@ -158,7 +158,7 @@
   private final ImmutableSet<String> enabledFeatures;
   private final ImmutableSet<String> disabledFeatures;
   private final String ruleClassNameForLogging;
-  private final BuildConfiguration hostConfiguration;
+  private final BuildConfigurationValue hostConfiguration;
   private final ConfigurationFragmentPolicy configurationFragmentPolicy;
   private final ConfiguredRuleClassProvider ruleClassProvider;
   private final RuleErrorConsumer reporter;
@@ -362,7 +362,7 @@
   }
 
   /** Returns the host configuration for this rule. */
-  public BuildConfiguration getHostConfiguration() {
+  public BuildConfigurationValue getHostConfiguration() {
     return hostConfiguration;
   }
 
@@ -456,8 +456,8 @@
       String name,
       String additionalErrorMessage,
       ConfigurationTransition transition) {
-    // TODO(bazel-team): The fragments can also be accessed directly through BuildConfiguration.
-    // Can we lock that down somehow?
+    // TODO(bazel-team): The fragments can also be accessed directly through
+    // BuildConfigurationValue. Can we lock that down somehow?
     Preconditions.checkArgument(
         isLegalFragment(fragment, transition),
         "%s has to declare '%s' as a required fragment in %s configuration in order to access"
@@ -512,7 +512,7 @@
     return isLegalFragment(fragment, NoTransition.INSTANCE);
   }
 
-  private BuildConfiguration getConfiguration(ConfigurationTransition transition) {
+  private BuildConfigurationValue getConfiguration(ConfigurationTransition transition) {
     return transition.isHostTransition() ? hostConfiguration : getConfiguration();
   }
 
@@ -531,7 +531,7 @@
   public static ActionOwner createActionOwner(
       Rule rule,
       ImmutableList<AspectDescriptor> aspectDescriptors,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       ImmutableMap<String, String> execProperties,
       @Nullable PlatformInfo executionPlatform) {
     return ActionOwner.create(
@@ -714,7 +714,7 @@
   /**
    * Same as {@link #getPackageRelativeArtifact(PathFragment, ArtifactRoot)} but includes the option
    * option to use a content-based path for this artifact (see {@link
-   * BuildConfiguration#useContentBasedOutputPaths()}).
+   * BuildConfigurationValue#useContentBasedOutputPaths()}).
    */
   private Artifact.DerivedArtifact getPackageRelativeArtifact(
       PathFragment relative, ArtifactRoot root, boolean contentBasedPath) {
@@ -732,7 +732,7 @@
   /**
    * Same as {@link #getPackageRelativeArtifact(String, ArtifactRoot)} but includes the option to
    * use a content-based path for this artifact (see {@link
-   * BuildConfiguration#useContentBasedOutputPaths()}).
+   * BuildConfigurationValue#useContentBasedOutputPaths()}).
    */
   private Artifact getPackageRelativeArtifact(
       String relative, ArtifactRoot root, boolean contentBasedPath) {
@@ -762,7 +762,7 @@
   /**
    * Same as {@link #getDerivedArtifact(PathFragment, ArtifactRoot)} but includes the option to use
    * a content-based path for this artifact (see {@link
-   * BuildConfiguration#useContentBasedOutputPaths()}).
+   * BuildConfigurationValue#useContentBasedOutputPaths()}).
    */
   public Artifact.DerivedArtifact getDerivedArtifact(
       PathFragment rootRelativePath, ArtifactRoot root, boolean contentBasedPath) {
@@ -923,15 +923,16 @@
 
   /**
    * For a given attribute, returns all declared provider provided by targets of that attribute.
-   * Each declared provider is keyed by the {@link BuildConfiguration} under which the provider was
-   * created.
+   * Each declared provider is keyed by the {@link BuildConfigurationValue} under which the provider
+   * was created.
    */
   public <C extends Info>
-      ImmutableListMultimap<BuildConfiguration, C> getPrerequisitesByConfiguration(
+      ImmutableListMultimap<BuildConfigurationValue, C> getPrerequisitesByConfiguration(
           String attributeName, BuiltinProvider<C> provider) {
     checkAttributeIsDependency(attributeName);
     List<ConfiguredTargetAndData> ctatCollection = getPrerequisiteConfiguredTargets(attributeName);
-    ImmutableListMultimap.Builder<BuildConfiguration, C> result = ImmutableListMultimap.builder();
+    ImmutableListMultimap.Builder<BuildConfigurationValue, C> result =
+        ImmutableListMultimap.builder();
     for (ConfiguredTargetAndData prerequisite : ctatCollection) {
       C prerequisiteProvider = prerequisite.getConfiguredTarget().get(provider);
       if (prerequisiteProvider != null) {
@@ -944,13 +945,13 @@
   /**
    * For a given attribute, returns all {@link TransitiveInfoCollection}s provided by targets of
    * that attribute. Each {@link TransitiveInfoCollection} is keyed by the {@link
-   * BuildConfiguration} under which the collection was created.
+   * BuildConfigurationValue} under which the collection was created.
    */
-  public ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection>
+  public ImmutableListMultimap<BuildConfigurationValue, TransitiveInfoCollection>
       getPrerequisitesByConfiguration(String attributeName) {
     checkAttributeIsDependency(attributeName);
     List<ConfiguredTargetAndData> ctatCollection = getPrerequisiteConfiguredTargets(attributeName);
-    ImmutableListMultimap.Builder<BuildConfiguration, TransitiveInfoCollection> result =
+    ImmutableListMultimap.Builder<BuildConfigurationValue, TransitiveInfoCollection> result =
         ImmutableListMultimap.builder();
     for (ConfiguredTargetAndData prerequisite : ctatCollection) {
       result.put(prerequisite.getConfiguration(), prerequisite.getConfiguredTarget());
@@ -1472,7 +1473,7 @@
   /**
    * Same as {@link #getImplicitOutputArtifact(ImplicitOutputsFunction)} but includes the option to
    * use a content-based path for this artifact (see {@link
-   * BuildConfiguration#useContentBasedOutputPaths()}).
+   * BuildConfigurationValue#useContentBasedOutputPaths()}).
    */
   public Artifact getImplicitOutputArtifact(
       ImplicitOutputsFunction function, boolean contentBasedPath) throws InterruptedException {
@@ -1496,7 +1497,7 @@
   /**
    * Same as {@link #getImplicitOutputArtifact(String)} but includes the option to use a a
    * content-based path for this artifact (see {@link
-   * BuildConfiguration#useContentBasedOutputPaths()}).
+   * BuildConfigurationValue#useContentBasedOutputPaths()}).
    */
   // TODO(bazel-team): Consider removing contentBasedPath stuff, which is unused as of 18 months
   // after its introduction in cl/252148134.
@@ -1630,10 +1631,10 @@
     private final AnalysisEnvironment env;
     private final Target target;
     private final ImmutableList<Aspect> aspects;
-    private final BuildConfiguration configuration;
+    private final BuildConfigurationValue configuration;
     private final RuleErrorConsumer reporter;
     private ConfiguredRuleClassProvider ruleClassProvider;
-    private BuildConfiguration hostConfiguration;
+    private BuildConfigurationValue hostConfiguration;
     private ConfigurationFragmentPolicy configurationFragmentPolicy;
     private ActionLookupKey actionOwnerSymbol;
     private OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap;
@@ -1651,7 +1652,7 @@
         AnalysisEnvironment env,
         Target target,
         ImmutableList<Aspect> aspects,
-        BuildConfiguration configuration) {
+        BuildConfigurationValue configuration) {
       this.env = Preconditions.checkNotNull(env);
       this.target = Preconditions.checkNotNull(target);
       this.aspects = Preconditions.checkNotNull(aspects);
@@ -1739,7 +1740,7 @@
       return this;
     }
 
-    public Builder setHostConfiguration(BuildConfiguration hostConfiguration) {
+    public Builder setHostConfiguration(BuildConfigurationValue hostConfiguration) {
       this.hostConfiguration = hostConfiguration;
       return this;
     }
@@ -2003,7 +2004,7 @@
           + target.getAssociatedRule().getRuleClass();
     }
 
-    public BuildConfiguration getConfiguration() {
+    public BuildConfigurationValue getConfiguration() {
       return configuration;
     }
 
@@ -2192,12 +2193,12 @@
   private static final class ErrorReporter extends EventHandlingErrorReporter
       implements RuleErrorConsumer {
     private final Rule rule;
-    private final BuildConfiguration configuration;
+    private final BuildConfigurationValue configuration;
 
     ErrorReporter(
         AnalysisEnvironment env,
         Rule rule,
-        BuildConfiguration configuration,
+        BuildConfigurationValue configuration,
         String ruleClassNameForLogging) {
       super(ruleClassNameForLogging, env);
       this.rule = rule;
@@ -2229,7 +2230,7 @@
     }
 
     @Override
-    protected BuildConfiguration getConfiguration() {
+    protected BuildConfigurationValue getConfiguration() {
       return configuration;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
index d0fe247..6fcc0e6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.SourceManifestAction.ManifestType;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
 import com.google.devtools.build.lib.analysis.actions.SymlinkTreeAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.RunUnder;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -362,7 +362,7 @@
             RUNFILES_DIR_EXT);
     PathFragment outputManifestPath = runfilesDir.getRelative(OUTPUT_MANIFEST_BASENAME);
 
-    BuildConfiguration config = context.getConfiguration();
+    BuildConfigurationValue config = context.getConfiguration();
     Artifact outputManifest =
         context.getDerivedArtifact(outputManifestPath, context.getBinDirectory());
     context
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ShToolchain.java b/src/main/java/com/google/devtools/build/lib/analysis/ShToolchain.java
index c785da4..1b22abb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ShToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ShToolchain.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
 /** Class to work with the shell toolchain, e.g. get the shell interpreter's path. */
@@ -25,7 +25,7 @@
    *
    * <p>This method checks the configuration's {@link ShellConfiguration} fragment.
    */
-  public static PathFragment getPath(BuildConfiguration config) {
+  public static PathFragment getPath(BuildConfigurationValue config) {
     PathFragment result = PathFragment.EMPTY_FRAGMENT;
 
     ShellConfiguration configFragment =
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetAndConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetAndConfiguration.java
index ac3d6fa..05bc361 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetAndConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetAndConfiguration.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.common.base.Preconditions;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.Target;
@@ -28,9 +28,9 @@
 @Immutable
 public final class TargetAndConfiguration {
   private final Target target;
-  @Nullable private final BuildConfiguration configuration;
+  @Nullable private final BuildConfigurationValue configuration;
 
-  public TargetAndConfiguration(Target target, @Nullable BuildConfiguration configuration) {
+  public TargetAndConfiguration(Target target, @Nullable BuildConfigurationValue configuration) {
     this.target = Preconditions.checkNotNull(target);
     this.configuration = configuration;
   }
@@ -75,7 +75,7 @@
   }
 
   @Nullable
-  public BuildConfiguration getConfiguration() {
+  public BuildConfigurationValue getConfiguration() {
     return configuration;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
index 80132f3..9c54ee9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.actions.CompletionContext.ArtifactReceiver;
 import com.google.devtools.build.lib.actions.EventReportingArtifacts;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.analysis.test.TestConfiguration;
@@ -161,7 +161,7 @@
     this.isTest = isTest;
     this.announceTargetSummary = announceTargetSummary;
     this.testTimeoutSeconds = isTest ? getTestTimeoutSeconds(targetAndData) : null;
-    BuildConfiguration configuration = targetAndData.getConfiguration();
+    BuildConfigurationValue configuration = targetAndData.getConfiguration();
     this.configEventId =
         configuration != null ? configuration.getEventId() : BuildEventIdUtil.nullConfigurationId();
     this.configurationEvent = configuration != null ? configuration.toBuildEvent() : null;
@@ -538,7 +538,7 @@
    * category and configuration.
    */
   private static Long getTestTimeoutSeconds(ConfiguredTargetAndData targetAndData) {
-    BuildConfiguration configuration = targetAndData.getConfiguration();
+    BuildConfigurationValue configuration = targetAndData.getConfiguration();
     Rule associatedRule = targetAndData.getTarget().getAssociatedRule();
     TestTimeout categoricalTimeout = TestTimeout.getTestTimeout(associatedRule);
     return configuration
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
index 26efabc..114e0b8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
@@ -15,7 +15,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.flogger.GoogleLogger;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventContext;
 import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil;
@@ -36,9 +36,9 @@
 public class TargetConfiguredEvent implements BuildEventWithConfiguration {
   private static final GoogleLogger logger = GoogleLogger.forEnclosingClass();
   private final Target target;
-  private final Collection<BuildConfiguration> configurations;
+  private final Collection<BuildConfigurationValue> configurations;
 
-  TargetConfiguredEvent(Target target, Collection<BuildConfiguration> configurations) {
+  TargetConfiguredEvent(Target target, Collection<BuildConfigurationValue> configurations) {
     this.configurations = configurations;
     this.target = target;
   }
@@ -46,7 +46,7 @@
   @Override
   public Collection<BuildEvent> getConfigurations() {
     ImmutableList.Builder<BuildEvent> builder = new ImmutableList.Builder<>();
-    for (BuildConfiguration config : configurations) {
+    for (BuildConfigurationValue config : configurations) {
       if (config != null) {
         builder.add(config.toBuildEvent());
       } else {
@@ -64,7 +64,7 @@
   @Override
   public Collection<BuildEventId> getChildrenEvents() {
     ImmutableList.Builder<BuildEventId> childrenBuilder = ImmutableList.builder();
-    for (BuildConfiguration config : configurations) {
+    for (BuildConfigurationValue config : configurations) {
       if (config != null) {
         childrenBuilder.add(
             BuildEventIdUtil.targetCompleted(target.getLabel(), config.getEventId()));
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java
index e304257..3227fb0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java
@@ -19,12 +19,12 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
 import com.google.devtools.build.lib.actions.ActionKeyContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import java.util.List;
 import java.util.Optional;
@@ -44,7 +44,7 @@
 
   private final AnalysisEnvironment env;
   private final Target target;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
 
   /**
    * This only contains prerequisites that are not declared in rule attributes, with the exception
@@ -63,7 +63,7 @@
   TargetContext(
       AnalysisEnvironment env,
       Target target,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Set<ConfiguredTargetAndData> directPrerequisites,
       NestedSet<PackageGroupContents> visibility) {
     this.env = env;
@@ -96,12 +96,12 @@
    * guaranteed to be non-null for rules and for output files.
    */
   @Nullable
-  public BuildConfiguration getConfiguration() {
+  public BuildConfigurationValue getConfiguration() {
     return configuration;
   }
 
-  public BuildConfigurationValue.Key getConfigurationKey() {
-    return BuildConfigurationValue.key(configuration);
+  public BuildConfigurationKey getConfigurationKey() {
+    return configuration.getKey();
   }
 
   public NestedSet<PackageGroupContents> getVisibility() {
@@ -115,7 +115,7 @@
    */
   @Nullable
   public TransitiveInfoCollection findDirectPrerequisite(
-      Label label, Optional<BuildConfiguration> config) {
+      Label label, Optional<BuildConfigurationValue> config) {
     if (directPrerequisites.containsKey(label)) {
       List<ConfiguredTargetAndData> prerequisites = directPrerequisites.get(label);
       // If the config is present, find the prereq with that configuration. Otherwise, return the
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Util.java b/src/main/java/com/google/devtools/build/lib/analysis/Util.java
index b2dda41..5484214 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Util.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Util.java
@@ -17,7 +17,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet;
 import com.google.devtools.build.lib.packages.AttributeMap;
@@ -100,8 +100,8 @@
     if (toolchainContext != null) {
       // This logic should stay up to date with the dep creation logic in
       // DependencyResolver#partiallyResolveDependencies.
-      BuildConfiguration targetConfiguration = ruleContext.getConfiguration();
-      BuildConfiguration hostConfiguration = ruleContext.getHostConfiguration();
+      BuildConfigurationValue targetConfiguration = ruleContext.getConfiguration();
+      BuildConfigurationValue hostConfiguration = ruleContext.getHostConfiguration();
       for (Label toolchain : toolchainContext.resolvedToolchainLabels()) {
         if (DependencyResolver.shouldUseToolchainTransition(
             targetConfiguration, ruleContext.getRule())) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java
index 2461bb3..d284f62 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ActionConstructionContext.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -58,8 +58,8 @@
   /** Returns the action key context. */
   ActionKeyContext getActionKeyContext();
 
-  /** Returns the {@link BuildConfiguration} for which the given rule is analyzed. */
-  BuildConfiguration getConfiguration();
+  /** Returns the {@link BuildConfigurationValue} for which the given rule is analyzed. */
+  BuildConfigurationValue getConfiguration();
 
   /** The current analysis environment. */
   AnalysisEnvironment getAnalysisEnvironment();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index c356893..43b1a45 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -60,7 +60,7 @@
 import com.google.devtools.build.lib.actions.extra.SpawnInfo;
 import com.google.devtools.build.lib.analysis.FilesToRunProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.starlark.Args;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -696,7 +696,7 @@
 
     @VisibleForTesting
     @CheckReturnValue
-    public SpawnAction build(ActionOwner owner, BuildConfiguration configuration) {
+    public SpawnAction build(ActionOwner owner, BuildConfigurationValue configuration) {
       CommandLines.Builder result = CommandLines.builder();
       if (executableArg != null) {
         result.addSingleArgument(executableArg);
@@ -746,7 +746,7 @@
         ActionOwner owner,
         CommandLines commandLines,
         CommandLineLimits commandLineLimits,
-        @Nullable BuildConfiguration configuration,
+        @Nullable BuildConfigurationValue configuration,
         ActionEnvironment env) {
       NestedSet<Artifact> tools = toolsBuilder.build();
 
@@ -796,7 +796,7 @@
         CommandLineLimits commandLineLimits,
         boolean isShellCommand,
         ActionEnvironment env,
-        @Nullable BuildConfiguration configuration,
+        @Nullable BuildConfigurationValue configuration,
         ImmutableMap<String, String> executionInfo,
         CharSequence progressMessage,
         RunfilesSupplier runfilesSupplier,
@@ -983,7 +983,7 @@
      * action and its value will be "baz", or whatever the corresponding {@code --client_env} flag
      * specified, respectively.
      *
-     * @see {@link BuildConfiguration#getLocalShellEnvironment}
+     * @see {@link BuildConfigurationValue#getLocalShellEnvironment}
      */
     public Builder useDefaultShellEnvironment() {
       this.environment = null;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/StarlarkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/StarlarkAction.java
index 867f2dd..5c45c24 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/StarlarkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/StarlarkAction.java
@@ -38,7 +38,7 @@
 import com.google.devtools.build.lib.actions.Spawn;
 import com.google.devtools.build.lib.actions.SpawnResult;
 import com.google.devtools.build.lib.actions.UserExecException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -372,7 +372,7 @@
         CommandLineLimits commandLineLimits,
         boolean isShellCommand,
         ActionEnvironment env,
-        @Nullable BuildConfiguration configuration,
+        @Nullable BuildConfigurationValue configuration,
         ImmutableMap<String, String> executionInfo,
         CharSequence progressMessage,
         RunfilesSupplier runfilesSupplier,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java
index 645e1f9..14a06ca 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.actions.ActionResult;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.Runfiles;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -63,7 +63,7 @@
    */
   public SymlinkTreeAction(
       ActionOwner owner,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       Artifact inputManifest,
       @Nullable Runfiles runfiles,
       Artifact outputManifest,
@@ -82,8 +82,8 @@
 
   /**
    * Creates SymlinkTreeAction instance. Prefer the constructor that takes a {@link
-   * BuildConfiguration} instance; it is less likely to require changes in the future if we add more
-   * command-line flags that affect this action.
+   * BuildConfigurationValue} instance; it is less likely to require changes in the future if we add
+   * more command-line flags that affect this action.
    *
    * @param owner action owner
    * @param inputManifest the input runfiles manifest
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java
index 2849126..117c61a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java
@@ -15,7 +15,7 @@
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactRoot;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.Serializable;
 
@@ -52,7 +52,7 @@
   /** Create actions and artifacts for language-specific build-info files. */
   BuildInfoCollection create(
       BuildInfoContext context,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       Artifact buildInfo,
       Artifact buildChangelist);
 
@@ -65,5 +65,5 @@
    * Returns false if this build info factory is disabled based on the configuration (usually by
    * checking if all required configuration fragments are present).
    */
-  boolean isEnabled(BuildConfiguration config);
+  boolean isEnabled(BuildConfigurationValue config);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationCollection.java
index 7d1fbe2..cf2539c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationCollection.java
@@ -30,20 +30,21 @@
  */
 @ThreadSafe
 public final class BuildConfigurationCollection {
-  private final ImmutableList<BuildConfiguration> targetConfigurations;
-  private final BuildConfiguration hostConfiguration;
+  private final ImmutableList<BuildConfigurationValue> targetConfigurations;
+  private final BuildConfigurationValue hostConfiguration;
 
   public BuildConfigurationCollection(
-      ImmutableList<BuildConfiguration> targetConfigurations, BuildConfiguration hostConfiguration)
+      ImmutableList<BuildConfigurationValue> targetConfigurations,
+      BuildConfigurationValue hostConfiguration)
       throws InvalidConfigurationException {
     this.targetConfigurations = targetConfigurations;
     this.hostConfiguration = hostConfiguration;
 
     // Except for the host configuration (which may be identical across target configs), the other
     // configurations must all have different cache keys or we will end up with problems.
-    HashMap<String, BuildConfiguration> cacheKeyConflictDetector = new HashMap<>();
-    for (BuildConfiguration config : targetConfigurations) {
-      BuildConfiguration old = cacheKeyConflictDetector.put(config.checksum(), config);
+    HashMap<String, BuildConfigurationValue> cacheKeyConflictDetector = new HashMap<>();
+    for (BuildConfigurationValue config : targetConfigurations) {
+      BuildConfigurationValue old = cacheKeyConflictDetector.put(config.checksum(), config);
       if (old != null) {
         throw new InvalidConfigurationException(
             "Conflicting configurations: " + config + " & " + old, Code.CONFLICTING_CONFIGURATIONS);
@@ -51,7 +52,7 @@
     }
   }
 
-  public ImmutableList<BuildConfiguration> getTargetConfigurations() {
+  public ImmutableList<BuildConfigurationValue> getTargetConfigurations() {
     return targetConfigurations;
   }
 
@@ -62,7 +63,7 @@
    * entire collection. This may not be true in the future and more flexible interfaces will likely
    * supplant this interface anyway.
    */
-  public BuildConfiguration getHostConfiguration() {
+  public BuildConfigurationValue getHostConfiguration() {
     return hostConfiguration;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationOptionDetails.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationOptionDetails.java
index 2a5d435..2e491d0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationOptionDetails.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationOptionDetails.java
@@ -15,19 +15,19 @@
 package com.google.devtools.build.lib.analysis.config;
 
 /**
- * Retrieves {@link TransitiveOptionDetails} from {@link BuildConfiguration} instances.
+ * Retrieves {@link TransitiveOptionDetails} from {@link BuildConfigurationValue} instances.
  *
  * <p>This class's existence allows for the use of Blaze visibility to limit access to option data
  * to only the configuration-specific rules which need to access or manipulate the configuration in
  * such a meta way - in most cases, there should be no need to use this class. Instead, access
- * desired configuration fragments via {@link BuildConfiguration#getFragment(Class)}.
+ * desired configuration fragments via {@link BuildConfigurationValue#getFragment(Class)}.
  */
 public class BuildConfigurationOptionDetails {
 
   /** Utility class - no need to instantiate. */
   private BuildConfigurationOptionDetails() {}
 
-  public static TransitiveOptionDetails get(BuildConfiguration configuration) {
+  public static TransitiveOptionDetails get(BuildConfigurationValue configuration) {
     return configuration.getTransitiveOptionDetails();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java
similarity index 89%
rename from src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
rename to src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java
index 578af01..85e4556 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java
@@ -35,15 +35,16 @@
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.BuildConfigurationApi;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.RegexFilter;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.skyframe.SkyValue;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.function.Supplier;
@@ -51,28 +52,26 @@
 import net.starlark.java.annot.StarlarkBuiltin;
 
 /**
- * Instances of BuildConfiguration represent a collection of context information which may affect a
- * build (for example: the target platform for compilation, or whether or not debug tables are
- * required). In fact, all "environmental" information (e.g. from the tool's command-line, as
- * opposed to the BUILD file) that can affect the output of any build tool should be explicitly
- * represented in the BuildConfiguration instance.
+ * Represents a collection of context information which may affect a build (for example: the target
+ * platform for compilation, or whether or not debug tables are required). In fact, all
+ * "environmental" information (e.g. from the tool's command-line, as opposed to the BUILD file)
+ * that can affect the output of any build tool should be explicitly represented in the {@code
+ * BuildConfigurationValue} instance.
  *
  * <p>A single build may require building tools to run on a variety of platforms: when compiling a
  * server application for production, we must build the build tools (like compilers) to run on the
  * host platform, but cross-compile the application for the production environment.
  *
- * <p>There is always at least one BuildConfiguration instance in any build: the one representing
- * the host platform. Additional instances may be created, in a cross-compilation build, for
- * example.
+ * <p>There is always at least one {@code BuildConfigurationValue} instance in any build: the one
+ * representing the host platform. Additional instances may be created, in a cross-compilation
+ * build, for example.
  *
- * <p>Instances of BuildConfiguration are canonical:
+ * <p>Instances of {@code BuildConfigurationValue} are canonical:
  *
  * <pre>c1.equals(c2) <=> c1==c2.</pre>
  */
-// TODO(janakr): If overhead of fragments class names is too high, add constructor that just takes
-// fragments and gets names from them.
 @AutoCodec
-public class BuildConfiguration implements BuildConfigurationApi {
+public class BuildConfigurationValue implements BuildConfigurationApi, SkyValue {
 
   private static final Interner<ImmutableSortedMap<Class<? extends Fragment>, Fragment>>
       fragmentsInterner = BlazeInterners.newWeakInterner();
@@ -109,8 +108,6 @@
 
   private final ImmutableMap<String, String> commandLineBuildVariables;
 
-  private final int hashCode; // We can precompute the hash code as all its inputs are immutable.
-
   /** Data for introspecting the options used by this configuration. */
   private final TransitiveOptionDetails transitiveOptionDetails;
 
@@ -119,34 +116,8 @@
   private final boolean siblingRepositoryLayout;
 
   /**
-   * Returns {@code true} if this configuration is semantically equal to the other, including
-   * checking that both have the same sets of fragments and options.
-   */
-  @Override
-  public boolean equals(Object other) {
-    if (this == other) {
-      return true;
-    }
-    if (!(other instanceof BuildConfiguration)) {
-      return false;
-    }
-    BuildConfiguration otherConfig = (BuildConfiguration) other;
-    return fragments.values().asList().equals(otherConfig.fragments.values().asList())
-        && buildOptions.equals(otherConfig.buildOptions);
-  }
-
-  private int computeHashCode() {
-    return Objects.hash(fragments, buildOptions.getNativeOptions());
-  }
-
-  @Override
-  public int hashCode() {
-    return hashCode;
-  }
-
-  /**
-   * Validates the options for this BuildConfiguration. Issues warnings for the use of deprecated
-   * options, and warnings or errors for any option settings that conflict.
+   * Validates the options for this BuildConfigurationValue. Issues warnings for the use of
+   * deprecated options, and warnings or errors for any option settings that conflict.
    */
   public void reportInvalidOptions(EventHandler reporter) {
     for (Fragment fragment : fragments.values()) {
@@ -168,7 +139,7 @@
     return ActionEnvironment.split(testEnv);
   }
 
-  public BuildConfiguration(
+  public BuildConfigurationValue(
       BlazeDirectories directories,
       ImmutableMap<Class<? extends Fragment>, Fragment> fragments,
       FragmentClassSet fragmentClassSet,
@@ -215,25 +186,18 @@
         TransitiveOptionDetails.forOptions(
             buildOptions.getNativeOptions(), buildOptions.getStarlarkOptions());
 
-    ImmutableMap.Builder<String, String> globalMakeEnvBuilder = ImmutableMap.builder();
-
+    // These should be documented in the build encyclopedia.
     // TODO(configurability-team): Deprecate TARGET_CPU in favor of platforms.
-    globalMakeEnvBuilder.put("TARGET_CPU", options.cpu);
-    globalMakeEnvBuilder.put("COMPILATION_MODE", options.compilationMode.toString());
-
-    /*
-     * Attention! Document these in the build-encyclopedia
-     */
-    // the bin directory and the genfiles directory
-    // These variables will be used on Windows as well, so we need to make sure
-    // that paths use the correct system file-separator.
-    globalMakeEnvBuilder.put(
-        "BINDIR", getBinDirectory(RepositoryName.MAIN).getExecPath().getPathString());
-    globalMakeEnvBuilder.put(
-        "GENDIR", getGenfilesDirectory(RepositoryName.MAIN).getExecPath().getPathString());
-    globalMakeEnv = globalMakeEnvBuilder.build();
-
-    hashCode = computeHashCode();
+    globalMakeEnv =
+        ImmutableMap.of(
+            "TARGET_CPU",
+            options.cpu,
+            "COMPILATION_MODE",
+            options.compilationMode.toString(),
+            "BINDIR",
+            getBinDirectory(RepositoryName.MAIN).getExecPathString(),
+            "GENDIR",
+            getGenfilesDirectory(RepositoryName.MAIN).getExecPathString());
 
     this.reservedActionMnemonics = reservedActionMnemonics;
     this.buildEventSupplier = Suppliers.memoize(this::createBuildEvent);
@@ -253,6 +217,17 @@
   }
 
   /**
+   * Returns the {@link BuildConfigurationKey} for this configuration.
+   *
+   * <p>Note that this method does not apply a platform mapping. It is assumed that this
+   * configuration was created with a platform mapping and thus its key does not need to be mapped
+   * again.
+   */
+  public BuildConfigurationKey getKey() {
+    return BuildConfigurationKey.withoutPlatformMapping(fragmentClassSet, buildOptions);
+  }
+
+  /**
    * Retrieves the {@link TransitiveOptionDetails} containing data on this configuration's options.
    *
    * @see BuildConfigurationOptionDetails
@@ -396,8 +371,8 @@
 
   /**
    * Returns the configuration-dependent string for this configuration. This is also the name of the
-   * configuration's base output directory unless {@link CoreOptions#outputDirectoryName} overrides
-   * it.
+   * configuration's base output directory unless {@link #isHostConfiguration} is {@code true}, in
+   * which case the output directory is named {@code host}.
    */
   public String getMnemonic() {
     return outputDirectories.getMnemonic();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index e5b25ce..5d7184d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.packages.AttributeTransitionData;
 import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredValueCreationException;
 import com.google.devtools.build.lib.skyframe.PackageValue;
 import com.google.devtools.build.lib.skyframe.PlatformMappingValue;
@@ -87,13 +87,13 @@
   @VisibleForTesting
   public static final Comparator<Dependency> SPLIT_DEP_ORDERING =
       Comparator.comparing(
-              Functions.compose(BuildConfiguration::getMnemonic, Dependency::getConfiguration))
+              Functions.compose(BuildConfigurationValue::getMnemonic, Dependency::getConfiguration))
           .thenComparing(
-              Functions.compose(BuildConfiguration::checksum, Dependency::getConfiguration));
+              Functions.compose(BuildConfigurationValue::checksum, Dependency::getConfiguration));
 
   private final SkyFunction.Environment env;
   private final TargetAndConfiguration ctgValue;
-  private final BuildConfiguration hostConfiguration;
+  private final BuildConfigurationValue hostConfiguration;
   private final ImmutableMap<Label, ConfigMatchingProvider> configConditions;
 
   /** The key for {@link #starlarkTransitionCache}. */
@@ -172,7 +172,7 @@
   public ConfigurationResolver(
       SkyFunction.Environment env,
       TargetAndConfiguration ctgValue,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions) {
     this.env = env;
     this.ctgValue = ctgValue;
@@ -180,7 +180,7 @@
     this.configConditions = configConditions;
   }
 
-  private BuildConfiguration getCurrentConfiguration() {
+  private BuildConfigurationValue getCurrentConfiguration() {
     return ctgValue.getConfiguration();
   }
 
@@ -209,8 +209,8 @@
    *
    * @param dependencyKeys the transition requests for each dep and each dependency kind
    * @return a mapping from each dependency kind in the source target to the {@link
-   *     BuildConfiguration}s and {@link Label}s for the deps under that dependency kind . Returns
-   *     null if not all Skyframe dependencies are available.
+   *     BuildConfigurationValue}s and {@link Label}s for the deps under that dependency kind .
+   *     Returns null if not all Skyframe dependencies are available.
    */
   @Nullable
   public OrderedSetMultimap<DependencyKind, Dependency> resolveConfigurations(
@@ -334,14 +334,14 @@
       return null; // Need platform mappings from Skyframe.
     }
 
-    Map<String, BuildConfigurationValue.Key> configurationKeys = new HashMap<>();
+    Map<String, BuildConfigurationKey> configurationKeys = new HashMap<>();
     try {
       for (Map.Entry<String, BuildOptions> optionsEntry : toOptions.entrySet()) {
         String transitionKey = optionsEntry.getKey();
-        BuildConfigurationValue.Key buildConfigurationValueKey =
-            BuildConfigurationValue.keyWithPlatformMapping(
+        BuildConfigurationKey buildConfigurationKey =
+            BuildConfigurationKey.withPlatformMapping(
                 platformMappingValue, depFragments, optionsEntry.getValue());
-        configurationKeys.put(transitionKey, buildConfigurationValueKey);
+        configurationKeys.put(transitionKey, buildConfigurationKey);
       }
     } catch (OptionsParsingException e) {
       throw new ConfiguredValueCreationException(ctgValue, e.getMessage());
@@ -351,15 +351,14 @@
         env.getValuesOrThrow(configurationKeys.values(), InvalidConfigurationException.class);
     List<Dependency> dependencies = new ArrayList<>();
     try {
-      for (Map.Entry<String, BuildConfigurationValue.Key> entry : configurationKeys.entrySet()) {
+      for (Map.Entry<String, BuildConfigurationKey> entry : configurationKeys.entrySet()) {
         String transitionKey = entry.getKey();
         ValueOrException<InvalidConfigurationException> valueOrException =
             depConfigValues.get(entry.getValue());
         if (valueOrException.get() == null) {
           continue;
         }
-        BuildConfiguration configuration =
-            ((BuildConfigurationValue) valueOrException.get()).getConfiguration();
+        BuildConfigurationValue configuration = (BuildConfigurationValue) valueOrException.get();
         if (configuration != null) {
           Dependency resolvedDep =
               dependencyBuilder
@@ -563,7 +562,7 @@
   // Keep this in sync with {@link PrepareAnalysisPhaseFunction#resolveConfigurations}.
   public static TopLevelTargetsAndConfigsResult getConfigurationsFromExecutor(
       Iterable<TargetAndConfiguration> defaultContext,
-      Multimap<BuildConfiguration, DependencyKey> targetsToEvaluate,
+      Multimap<BuildConfigurationValue, DependencyKey> targetsToEvaluate,
       ExtendedEventHandler eventHandler,
       ConfigurationsCollector configurationsCollector)
       throws InvalidConfigurationException, InterruptedException {
@@ -579,12 +578,12 @@
         new LinkedHashMap<>();
     boolean hasError = false;
     if (!targetsToEvaluate.isEmpty()) {
-      for (BuildConfiguration fromConfig : targetsToEvaluate.keySet()) {
+      for (BuildConfigurationValue fromConfig : targetsToEvaluate.keySet()) {
         ConfigurationsResult configurationsResult =
             configurationsCollector.getConfigurations(
                 eventHandler, fromConfig.getOptions(), targetsToEvaluate.get(fromConfig));
         hasError |= configurationsResult.hasError();
-        for (Map.Entry<DependencyKey, BuildConfiguration> evaluatedTarget :
+        for (Map.Entry<DependencyKey, BuildConfigurationValue> evaluatedTarget :
             configurationsResult.getConfigurationMap().entries()) {
           Target target = labelsToTargets.get(evaluatedTarget.getKey().getLabel());
           successfullyEvaluatedTargets.put(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
index 744acfa..85185e0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
@@ -39,14 +39,14 @@
 import java.util.Map;
 
 /**
- * Core options affecting a {@link BuildConfiguration} that don't belong in domain-specific {@link
- * FragmentOptions}. All options defined here should be universal in that they affect configuration
- * regardless of which languages a build uses. In other words, this should only contain options that
- * aren't suitable for Starlark configuration.
+ * Core options affecting a {@link BuildConfigurationValue} that don't belong in domain-specific
+ * {@link FragmentOptions}. All options defined here should be universal in that they affect
+ * configuration regardless of which languages a build uses. In other words, this should only
+ * contain options that aren't suitable for Starlark configuration.
  *
  * <p>(Note: any client that creates a view will also need to declare BuildView.Options, which
  * affect the <i>mechanism</i> of view construction, even if they don't affect the value of the
- * BuildConfiguration instances.)
+ * BuildConfigurationValue instances.)
  *
  * <p>IMPORTANT: when adding new options, be sure to consider whether those values should be
  * propagated to the host configuration or not.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/OutputDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/config/OutputDirectories.java
index ddd7fec..86d54ae 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/OutputDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/OutputDirectories.java
@@ -48,7 +48,7 @@
    * Directories in the output tree.
    *
    * <p>The computation of the output directory should be a non-injective mapping from
-   * BuildConfiguration instances to strings. The result should identify the aspects of the
+   * BuildConfigurationValue instances to strings. The result should identify the aspects of the
    * configuration that should be reflected in the output file names. Furthermore the returned
    * string must not contain shell metacharacters.
    *
@@ -368,4 +368,3 @@
     }
   }
 }
-
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/RequiredFragmentsUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/config/RequiredFragmentsUtil.java
index fd5ac26..7d0a1bf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/RequiredFragmentsUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/RequiredFragmentsUtil.java
@@ -82,7 +82,7 @@
   @Nullable
   public static RequiredConfigFragmentsProvider getRuleRequiredFragmentsIfEnabled(
       Rule target,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       FragmentClassSet universallyRequiredFragments,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
       Iterable<ConfiguredTargetAndData> prerequisites) {
@@ -136,7 +136,7 @@
       Aspect aspect,
       ConfiguredAspectFactory aspectFactory,
       Rule associatedTarget,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       FragmentClassSet universallyRequiredFragments,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
       Iterable<ConfiguredTargetAndData> prerequisites) {
@@ -164,7 +164,7 @@
   /** Internal implementation that handles requirements common to both rules and aspects. */
   private static RequiredConfigFragmentsProvider.Builder getRequiredFragments(
       IncludeConfigFragmentsEnum mode,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       FragmentClassSet universallyRequiredFragments,
       ConfigurationFragmentPolicy configurationFragmentPolicy,
       Collection<ConfigMatchingProvider> configConditions,
@@ -290,7 +290,8 @@
     }
   }
 
-  private static IncludeConfigFragmentsEnum getRequiredFragmentsMode(BuildConfiguration config) {
+  private static IncludeConfigFragmentsEnum getRequiredFragmentsMode(
+      BuildConfigurationValue config) {
     return checkNotNull(
         config.getOptions().get(CoreOptions.class).includeRequiredConfigFragmentsProvider);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/SymlinkDefinition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/SymlinkDefinition.java
index 790d600..0350265 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/SymlinkDefinition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/SymlinkDefinition.java
@@ -52,8 +52,8 @@
    */
   ImmutableSet<Path> getLinkPaths(
       BuildRequestOptions buildRequestOptions,
-      Set<BuildConfiguration> targetConfigs,
-      Function<BuildOptions, BuildConfiguration> configGetter,
+      Set<BuildConfigurationValue> targetConfigs,
+      Function<BuildOptions, BuildConfigurationValue> configGetter,
       RepositoryName repositoryName,
       Path outputPath,
       Path execRoot);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
index a568b3a..e166f2f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
@@ -50,7 +50,7 @@
    * @return the target's configuration(s), expressed as a diff from the original configuration.
    */
   public static ConfigurationTransition evaluateTransition(
-      BuildConfiguration fromConfig,
+      BuildConfigurationValue fromConfig,
       ConfigurationTransition baseTransition,
       Target toTarget,
       @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
index 1377dab..a879896 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
@@ -32,7 +32,7 @@
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import java.util.function.Consumer;
 import javax.annotation.Nullable;
 import net.starlark.java.eval.Dict;
@@ -47,7 +47,7 @@
  */
 public abstract class AbstractConfiguredTarget implements ConfiguredTarget, VisibilityProvider {
   private final Label label;
-  private final BuildConfigurationValue.Key configurationKey;
+  private final BuildConfigurationKey configurationKey;
 
   private final NestedSet<PackageGroupContents> visibility;
 
@@ -75,13 +75,13 @@
           OutputGroupInfo.STARLARK_NAME,
           ACTIONS_FIELD_NAME);
 
-  public AbstractConfiguredTarget(Label label, BuildConfigurationValue.Key configurationKey) {
+  public AbstractConfiguredTarget(Label label, BuildConfigurationKey configurationKey) {
     this(label, configurationKey, NestedSetBuilder.emptySet(Order.STABLE_ORDER));
   }
 
   protected AbstractConfiguredTarget(
       Label label,
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       NestedSet<PackageGroupContents> visibility) {
     this.label = label;
     this.configurationKey = configurationKey;
@@ -99,7 +99,7 @@
   }
 
   @Override
-  public BuildConfigurationValue.Key getConfigurationKey() {
+  public BuildConfigurationKey getConfigurationKey() {
     return configurationKey;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
index 79e0f1c..bfcbacd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.util.FileType;
 import javax.annotation.Nullable;
 import net.starlark.java.eval.Dict;
@@ -52,7 +52,7 @@
 
   FileConfiguredTarget(
       Label label,
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       NestedSet<PackageGroupContents> visibility,
       Artifact artifact,
       @Nullable InstrumentedFilesInfo instrumentedFilesInfo,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
index 419d57a..7bc48ca 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.OutputFile;
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import net.starlark.java.eval.Printer;
 
 /** A ConfiguredTarget for an OutputFile. */
@@ -56,7 +56,7 @@
 
   private OutputFileConfiguredTarget(
       Label label,
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       NestedSet<PackageGroupContents> visibility,
       Artifact artifact,
       ConfiguredTarget generatingRule) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
index 0552704..46f3a96 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.packages.OutputFile;
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator;
@@ -85,7 +85,7 @@
   @VisibleForSerialization
   RuleConfiguredTarget(
       Label label,
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       NestedSet<PackageGroupContents> visibility,
       TransitiveInfoProviderMap providers,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
index 0211999..ce4d568 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.analysis.IncompatiblePlatformProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.configuredtargets.OutputFileConfiguredTarget;
 import com.google.devtools.build.lib.analysis.constraints.SupportedEnvironmentsProvider.RemovedEnvironmentCulprit;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
@@ -42,7 +42,7 @@
 import com.google.devtools.build.lib.server.FailureDetails.Analysis;
 import com.google.devtools.build.lib.server.FailureDetails.Analysis.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue.Key;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -63,7 +63,7 @@
 public class TopLevelConstraintSemantics {
   private final RuleContextConstraintSemantics constraintSemantics;
   private final PackageManager packageManager;
-  private final Function<Key, BuildConfiguration> configurationProvider;
+  private final Function<BuildConfigurationKey, BuildConfigurationValue> configurationProvider;
   private final ExtendedEventHandler eventHandler;
   private static final String TARGET_INCOMPATIBLE_ERROR_TEMPLATE =
       "Target %s is incompatible and cannot be built, but was explicitly requested.%s";
@@ -79,7 +79,7 @@
   public TopLevelConstraintSemantics(
       RuleContextConstraintSemantics constraintSemantics,
       PackageManager packageManager,
-      Function<Key, BuildConfiguration> configurationProvider,
+      Function<BuildConfigurationKey, BuildConfigurationValue> configurationProvider,
       ExtendedEventHandler eventHandler) {
     this.constraintSemantics = constraintSemantics;
     this.packageManager = packageManager;
@@ -259,7 +259,8 @@
     Multimap<ConfiguredTarget, MissingEnvironment> exceptionInducingTargets =
         ArrayListMultimap.create();
     for (ConfiguredTarget topLevelTarget : topLevelTargets) {
-      BuildConfiguration config = configurationProvider.apply(topLevelTarget.getConfigurationKey());
+      BuildConfigurationValue config =
+          configurationProvider.apply(topLevelTarget.getConfigurationKey());
       Target target = null;
       try {
         target = packageManager.getTarget(eventHandler, topLevelTarget.getLabel());
@@ -312,11 +313,11 @@
   }
 
   /**
-   * Helper method for {@link #checkTargetEnvironmentRestrictions} that populates inferred
-   * expected environments.
+   * Helper method for {@link #checkTargetEnvironmentRestrictions} that populates inferred expected
+   * environments.
    */
-  private List<Label> autoConfigureTargetEnvironments(BuildConfiguration config,
-      @Nullable Label environmentGroupLabel)
+  private List<Label> autoConfigureTargetEnvironments(
+      BuildConfigurationValue config, @Nullable Label environmentGroupLabel)
       throws InterruptedException, NoSuchTargetException, NoSuchPackageException {
     if (environmentGroupLabel == null) {
       return ImmutableList.of();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
index f4d4e7d..2cd1f72 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
@@ -43,7 +43,7 @@
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.ShToolchain;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.FragmentCollection;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
@@ -597,13 +597,13 @@
   }
 
   @Override
-  public BuildConfiguration getConfiguration() throws EvalException {
+  public BuildConfigurationValue getConfiguration() throws EvalException {
     checkMutable("configuration");
     return ruleContext.getConfiguration();
   }
 
   @Override
-  public BuildConfiguration getHostConfiguration() throws EvalException {
+  public BuildConfigurationValue getHostConfiguration() throws EvalException {
     checkMutable("host_configuration");
     return ruleContext.getHostConfiguration();
   }
@@ -634,7 +634,7 @@
   @Override
   public boolean instrumentCoverage(Object targetUnchecked) throws EvalException {
     checkMutable("coverage_instrumented");
-    BuildConfiguration config = ruleContext.getConfiguration();
+    BuildConfigurationValue config = ruleContext.getConfiguration();
     if (!config.isCodeCoverageEnabled()) {
       return false;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/annotations/processor/StarlarkConfigurationFieldProcessor.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/annotations/processor/StarlarkConfigurationFieldProcessor.java
index 7c541c4..7663447 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/annotations/processor/StarlarkConfigurationFieldProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/annotations/processor/StarlarkConfigurationFieldProcessor.java
@@ -113,8 +113,8 @@
       return false;
     }
     Element classElement = methodElement.getEnclosingElement();
-    // If configurationFragmentType is null, then BuildConfiguration.Fragment isn't even included
-    // in the current build, so the class clearly does not depend on it.
+    // If configurationFragmentType is null, then the fragment isn't even included in the current
+    // build, so the class clearly does not depend on it.
     if (configurationFragmentType == null
         || !typeUtils.isAssignable(classElement.asType(), configurationFragmentType.asType())) {
       return false;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java
index cd0e3e4..f251e44 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.FileProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -246,8 +246,8 @@
    * representing a rule) should be instrumented according the --instrumentation_filter and
    * --instrument_test_targets settings in {@code config}.
    */
-  public static boolean shouldIncludeLocalSources(BuildConfiguration config,
-      TransitiveInfoCollection target) {
+  public static boolean shouldIncludeLocalSources(
+      BuildConfigurationValue config, TransitiveInfoCollection target) {
     return shouldIncludeLocalSources(config, target.getLabel(),
         target.getProvider(TestProvider.class) != null);
   }
@@ -257,7 +257,7 @@
    * the --instrumentation_filter and --instrument_test_targets config settings.
    */
   public static boolean shouldIncludeLocalSources(
-      BuildConfiguration config, Label label, boolean isTest) {
+      BuildConfigurationValue config, Label label, boolean isTest) {
     return ((config.shouldInstrumentTestTargets() || !isTest)
         && config.getInstrumentationFilter().isIncluded(label.toString()));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
index b1b3eb2..6d14d7a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.analysis.SingleRunfilesSupplier;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.LazyWriteNestedSetOfPairAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.configuredtargets.PackageGroupConfiguredTarget;
 import com.google.devtools.build.lib.analysis.test.TestProvider.TestParams;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -186,7 +186,7 @@
   private TestParams createTestAction(int shards)
       throws InterruptedException { // due to TestTargetExecutionSettings
     PathFragment targetName = PathFragment.create(ruleContext.getLabel().getName());
-    BuildConfiguration config = ruleContext.getConfiguration();
+    BuildConfigurationValue config = ruleContext.getConfiguration();
     TestConfiguration testConfiguration = config.getFragment(TestConfiguration.class);
     AnalysisEnvironment env = ruleContext.getAnalysisEnvironment();
     ArtifactRoot root = ruleContext.getTestLogsDirectory();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java
index 327f2d4..2e8adcc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java
@@ -50,7 +50,7 @@
 import com.google.devtools.build.lib.actions.TestExecException;
 import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.SingleRunfilesSupplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.RunUnder;
 import com.google.devtools.build.lib.analysis.test.TestActionContext.FailedAttemptResult;
 import com.google.devtools.build.lib.analysis.test.TestActionContext.TestAttemptContinuation;
@@ -108,7 +108,7 @@
   private final Artifact testSetupScript;
   private final Artifact testXmlGeneratorScript;
   private final Artifact collectCoverageScript;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private final TestConfiguration testConfiguration;
   private final Artifact testLog;
   private final Artifact cacheStatus;
@@ -196,7 +196,7 @@
       TestTargetExecutionSettings executionSettings,
       int shardNum,
       int runNumber,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       String workspaceName,
       @Nullable PathFragment shExecutable,
       boolean cancelConcurrentTestsOnSuccess,
@@ -303,7 +303,7 @@
     return lcovMergerRunfilesSupplier;
   }
 
-  public BuildConfiguration getConfiguration() {
+  public BuildConfigurationValue getConfiguration() {
     return configuration;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestStrategy.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestStrategy.java
index 0da99ea..01da1f7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestStrategy.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
 import com.google.devtools.build.lib.actions.ExecException;
 import com.google.devtools.build.lib.actions.UserExecException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.PerLabelOptions;
 import com.google.devtools.build.lib.analysis.test.TestRunnerAction.ResolvedPaths;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -255,7 +255,7 @@
    * but ends up with the same effective value as all other rules in that bucket.
    */
   protected static final Duration getTimeout(TestRunnerAction testAction) {
-    BuildConfiguration configuration = testAction.getConfiguration();
+    BuildConfigurationValue configuration = testAction.getConfiguration();
     return configuration
         .getFragment(TestConfiguration.class)
         .getTestTimeout()
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestTargetExecutionSettings.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestTargetExecutionSettings.java
index d66120c..1d8dbe3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestTargetExecutionSettings.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestTargetExecutionSettings.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.Compression;
 import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.RunUnder;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -64,7 +64,7 @@
       throws InterruptedException { // due to CommandLine.arguments
     Preconditions.checkArgument(TargetUtils.isTestRule(ruleContext.getRule()));
     Preconditions.checkArgument(shards >= 0);
-    BuildConfiguration config = ruleContext.getConfiguration();
+    BuildConfigurationValue config = ruleContext.getConfiguration();
     TestConfiguration testConfig = config.getFragment(TestConfiguration.class);
 
     CommandLine targetArgs = runfilesSupport.getArgs();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestTrimmingTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestTrimmingTransitionFactory.java
index 3517a07..2ed95ef 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestTrimmingTransitionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestTrimmingTransitionFactory.java
@@ -64,7 +64,8 @@
     // transition is always invoked on every target in the top-level invocation. Thus, a wide
     // invocation, like //..., will cause the transition to be invoked on a large number of targets
     // leading to significant performance degradation. (Notably, the transition itself is somewhat
-    // fast; however, the post-processing of the BuildOptions into the actual BuildConfiguration
+    // fast; however, the post-processing of the BuildOptions into the actual
+    // BuildConfigurationValue
     // takes a significant amount of time).
     //
     // Test any caching changes for performance impact in a longwide scenario with
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 b883cbd..6994f6d 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
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction;
 import com.google.devtools.build.lib.bazel.bzlmod.ModuleExtensionResolutionFunction;
 import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction;
@@ -187,7 +187,8 @@
     }
 
     @Override
-    public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
+    public byte[] get(
+        Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env)
         throws AbruptExitException, InterruptedException {
       return print(repositoryCache.getRootPath());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 5fae569..9dfe2e7 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -25,8 +25,8 @@
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
 import com.google.devtools.build.lib.analysis.ShellConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration.ActionEnvironmentProvider;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue.ActionEnvironmentProvider;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.Fragment;
@@ -221,7 +221,7 @@
           env.put(entry.getKey(), entry.getValue());
         }
 
-        if (!BuildConfiguration.runfilesEnabled(options.get(CoreOptions.class))) {
+        if (!BuildConfigurationValue.runfilesEnabled(options.get(CoreOptions.class))) {
           // Setting this environment variable is for telling the binary running
           // in a Bazel action when to use runfiles library or runfiles tree.
           // The downside is that it will discard cache for all actions once
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
index 922c400..3fc16ff 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.Provider;
@@ -72,7 +72,7 @@
 
   @Override
   public void finalizeCompileActionBuilder(
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       FeatureConfiguration featureConfiguration,
       CppCompileActionBuilder actionBuilder,
       RuleErrorConsumer ruleErrorConsumer) {
@@ -114,7 +114,7 @@
   }
 
   @Override
-  public boolean needsDotdInputPruning(BuildConfiguration configuration) {
+  public boolean needsDotdInputPruning(BuildConfigurationValue configuration) {
     if (language == Language.CPP) {
       return true;
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/AnalysisPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/buildtool/AnalysisPhaseRunner.java
index a55b4d7..6124944 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/AnalysisPhaseRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/AnalysisPhaseRunner.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.BuildView;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionFunction;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.TargetPatternPhaseValue;
@@ -136,7 +136,7 @@
       reportTargets(env, analysisResult);
 
       for (ConfiguredTarget target : analysisResult.getTargetsToSkip()) {
-        BuildConfiguration config =
+        BuildConfigurationValue config =
             env.getSkyframeExecutor()
                 .getConfiguration(env.getReporter(), target.getConfigurationKey());
         Label label = target.getLabel();
@@ -240,24 +240,20 @@
                 timer.stop().elapsed(TimeUnit.MILLISECONDS),
                 view.getAndClearPkgManagerStatistics(),
                 env.getSkyframeExecutor().wasAnalysisCacheDiscardedAndResetBit()));
-    ImmutableSet<BuildConfigurationValue.Key> configurationKeys =
+    ImmutableSet<BuildConfigurationKey> configurationKeys =
         Stream.concat(
-                analysisResult
-                    .getTargetsToBuild()
-                    .stream()
+                analysisResult.getTargetsToBuild().stream()
                     .map(ConfiguredTarget::getConfigurationKey)
                     .distinct(),
                 analysisResult.getTargetsToTest() == null
                     ? Stream.empty()
-                    : analysisResult
-                        .getTargetsToTest()
-                        .stream()
+                    : analysisResult.getTargetsToTest().stream()
                         .map(ConfiguredTarget::getConfigurationKey)
                         .distinct())
             .filter(Objects::nonNull)
             .distinct()
             .collect(ImmutableSet.toImmutableSet());
-    Map<BuildConfigurationValue.Key, BuildConfiguration> configurationMap =
+    Map<BuildConfigurationKey, BuildConfigurationValue> configurationMap =
         env.getSkyframeExecutor().getConfigurations(env.getReporter(), configurationKeys);
     env.getEventBus()
         .post(
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/AqueryBuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/AqueryBuildTool.java
index 30b5cec..a608013 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/AqueryBuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/AqueryBuildTool.java
@@ -16,7 +16,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.query2.PostAnalysisQueryEnvironment;
 import com.google.devtools.build.lib.query2.PostAnalysisQueryEnvironment.TopLevelConfigurations;
@@ -112,7 +112,7 @@
   @Override
   protected PostAnalysisQueryEnvironment<ConfiguredTargetValue> getQueryEnvironment(
       BuildRequest request,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       TopLevelConfigurations topLevelConfigurations,
       Collection<SkyKey> transitiveConfigurationKeys,
       WalkableGraph walkableGraph) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ConfigSymlink.java b/src/main/java/com/google/devtools/build/lib/buildtool/ConfigSymlink.java
index 1c3e506..7ceb9dc 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ConfigSymlink.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ConfigSymlink.java
@@ -18,7 +18,7 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.ArtifactRoot;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.SymlinkDefinition;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
@@ -30,7 +30,7 @@
 class ConfigSymlink implements SymlinkDefinition {
   @FunctionalInterface
   interface ConfigPathGetter {
-    ArtifactRoot apply(BuildConfiguration configuration, RepositoryName repositoryName);
+    ArtifactRoot apply(BuildConfigurationValue configuration, RepositoryName repositoryName);
   }
 
   private final String suffix;
@@ -49,8 +49,8 @@
   @Override
   public ImmutableSet<Path> getLinkPaths(
       BuildRequestOptions buildRequestOptions,
-      Set<BuildConfiguration> targetConfigs,
-      Function<BuildOptions, BuildConfiguration> configGetter,
+      Set<BuildConfigurationValue> targetConfigs,
+      Function<BuildOptions, BuildConfigurationValue> configGetter,
       RepositoryName repositoryName,
       Path outputPath,
       Path execRoot) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java
index 9f9815c..9650f0e 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.buildtool;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.query2.PostAnalysisQueryEnvironment.TopLevelConfigurations;
 import com.google.devtools.build.lib.query2.cquery.ConfiguredTargetQueryEnvironment;
 import com.google.devtools.build.lib.query2.cquery.CqueryOptions;
@@ -36,7 +36,7 @@
   @Override
   protected ConfiguredTargetQueryEnvironment getQueryEnvironment(
       BuildRequest request,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       TopLevelConfigurations configurations,
       Collection<SkyKey> transitiveConfigurationKeys,
       WalkableGraph walkableGraph)
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 15e03e0..4ca0d44 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -46,7 +46,7 @@
 import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
 import com.google.devtools.build.lib.analysis.actions.SymlinkTreeActionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.test.TestActionContext;
@@ -622,14 +622,14 @@
   }
 
   /**
-   * Obtains the {@link BuildConfiguration} for a given {@link BuildOptions} for the purpose of
+   * Obtains the {@link BuildConfigurationValue} for a given {@link BuildOptions} for the purpose of
    * symlink creation.
    *
    * <p>In the event of a {@link InvalidConfigurationException}, a warning is emitted and null is
    * returned.
    */
   @Nullable
-  private static BuildConfiguration getConfiguration(
+  private static BuildConfigurationValue getConfiguration(
       SkyframeExecutor executor, Reporter reporter, BuildOptions options) {
     try {
       return executor.getConfiguration(reporter, options, /*keepGoing=*/ false);
@@ -677,7 +677,7 @@
     Reporter reporter = env.getReporter();
 
     // Gather configurations to consider.
-    Set<BuildConfiguration> targetConfigurations =
+    Set<BuildConfigurationValue> targetConfigurations =
         buildRequestOptions.useTopLevelTargetsForSymlinks()
             ? analysisResult.getTargetsToBuild().stream()
                 .map(ConfiguredTarget::getConfigurationKey)
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
index f249513..ac93bf2 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
@@ -21,7 +21,7 @@
 import com.google.common.flogger.GoogleLogger;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.SymlinkDefinition;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.ConvenienceSymlink;
@@ -102,8 +102,8 @@
       Path workspace,
       BlazeDirectories directories,
       EventHandler eventHandler,
-      Set<BuildConfiguration> targetConfigs,
-      Function<BuildOptions, BuildConfiguration> configGetter,
+      Set<BuildConfigurationValue> targetConfigs,
+      Function<BuildOptions, BuildConfigurationValue> configGetter,
       String productName) {
     Path execRoot = directories.getExecRoot(workspaceName);
     Path outputPath = directories.getOutputPath(workspaceName);
@@ -376,14 +376,14 @@
   @SuppressWarnings("deprecation") // RuleContext#get*Directory not available here.
   private static final ImmutableList<SymlinkDefinition> STANDARD_LINK_DEFINITIONS =
       ImmutableList.of(
-          new ConfigSymlink("bin", BuildConfiguration::getBinDirectory),
-          new ConfigSymlink("testlogs", BuildConfiguration::getTestLogsDirectory),
-          new ConfigSymlink("genfiles", BuildConfiguration::getGenfilesDirectory) {
+          new ConfigSymlink("bin", BuildConfigurationValue::getBinDirectory),
+          new ConfigSymlink("testlogs", BuildConfigurationValue::getTestLogsDirectory),
+          new ConfigSymlink("genfiles", BuildConfigurationValue::getGenfilesDirectory) {
             @Override
             public ImmutableSet<Path> getLinkPaths(
                 BuildRequestOptions buildRequestOptions,
-                Set<BuildConfiguration> targetConfigs,
-                Function<BuildOptions, BuildConfiguration> configGetter,
+                Set<BuildConfigurationValue> targetConfigs,
+                Function<BuildOptions, BuildConfigurationValue> configGetter,
                 RepositoryName repositoryName,
                 Path outputPath,
                 Path execRoot) {
@@ -410,8 +410,8 @@
             @Override
             public ImmutableSet<Path> getLinkPaths(
                 BuildRequestOptions buildRequestOptions,
-                Set<BuildConfiguration> targetConfigs,
-                Function<BuildOptions, BuildConfiguration> configGetter,
+                Set<BuildConfigurationValue> targetConfigs,
+                Function<BuildOptions, BuildConfigurationValue> configGetter,
                 RepositoryName repositoryName,
                 Path outputPath,
                 Path execRoot) {
@@ -429,8 +429,8 @@
             @Override
             public ImmutableSet<Path> getLinkPaths(
                 BuildRequestOptions buildRequestOptions,
-                Set<BuildConfiguration> targetConfigs,
-                Function<BuildOptions, BuildConfiguration> configGetter,
+                Set<BuildConfigurationValue> targetConfigs,
+                Function<BuildOptions, BuildConfigurationValue> configGetter,
                 RepositoryName repositoryName,
                 Path outputPath,
                 Path execRoot) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryBuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryBuildTool.java
index 33d76d8..8093b9d 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryBuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryBuildTool.java
@@ -15,7 +15,7 @@
 
 import com.google.devtools.build.lib.analysis.AnalysisResult;
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.query2.NamedThreadSafeOutputFormatterCallback;
 import com.google.devtools.build.lib.query2.PostAnalysisQueryEnvironment;
@@ -116,7 +116,7 @@
 
   protected abstract PostAnalysisQueryEnvironment<T> getQueryEnvironment(
       BuildRequest request,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       TopLevelConfigurations topLevelConfigurations,
       Collection<SkyKey> transitiveConfigurationKeys,
       WalkableGraph walkableGraph)
@@ -124,7 +124,7 @@
 
   private void doPostAnalysisQuery(
       BuildRequest request,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       TopLevelConfigurations topLevelConfigurations,
       Collection<SkyKey> transitiveConfigurationKeys,
       QueryRuntimeHelper queryRuntimeHelper,
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/TestFilteringCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/TestFilteringCompleteEvent.java
index febb37c..49f3328 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/TestFilteringCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/TestFilteringCompleteEvent.java
@@ -17,9 +17,9 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.TestProvider;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import java.util.Collection;
 import java.util.Map;
 import javax.annotation.concurrent.Immutable;
@@ -35,7 +35,7 @@
   private final Collection<ConfiguredTarget> targets;
   private final Collection<ConfiguredTarget> testTargets;
   private final Collection<ConfiguredTarget> skippedTests;
-  private final Map<BuildConfigurationValue.Key, BuildConfiguration> configurationMap;
+  private final Map<BuildConfigurationKey, BuildConfigurationValue> configurationMap;
 
   /**
    * Construct the event.
@@ -49,7 +49,7 @@
       Collection<? extends ConfiguredTarget> targets,
       Collection<? extends ConfiguredTarget> testTargets,
       Collection<? extends ConfiguredTarget> targetsToSkip,
-      Map<BuildConfigurationValue.Key, BuildConfiguration> configurationMap) {
+      Map<BuildConfigurationKey, BuildConfigurationValue> configurationMap) {
     this.targets = ImmutableList.copyOf(targets);
     this.testTargets = testTargets == null ? null : ImmutableList.copyOf(testTargets);
     this.skippedTests = ImmutableList.copyOf(targetsToSkip);
@@ -83,7 +83,7 @@
     return skippedTests;
   }
 
-  public BuildConfiguration getConfigurationForTarget(ConfiguredTarget target) {
+  public BuildConfigurationValue getConfigurationForTarget(ConfiguredTarget target) {
     return Preconditions.checkNotNull(configurationMap.get(target.getConfigurationKey()));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/causes/AnalysisFailedCause.java b/src/main/java/com/google/devtools/build/lib/causes/AnalysisFailedCause.java
index ed6ab45..744ee4a 100644
--- a/src/main/java/com/google/devtools/build/lib/causes/AnalysisFailedCause.java
+++ b/src/main/java/com/google/devtools/build/lib/causes/AnalysisFailedCause.java
@@ -22,8 +22,8 @@
 import javax.annotation.Nullable;
 
 /**
- * Class describing a {@link Cause} that can uniquely be described by a {@link Label} and
- * {@link com.google.devtools.build.lib.analysis.config.BuildConfiguration}. Note that the
+ * Class describing a {@link Cause} that can uniquely be described by a {@link Label} and {@link
+ * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue}. Note that the
  * configuration may be null, in which case this generates an UnconfiguredLabel event.
  */
 public class AnalysisFailedCause implements Cause {
diff --git a/src/main/java/com/google/devtools/build/lib/metrics/PostGCMemoryUseRecorder.java b/src/main/java/com/google/devtools/build/lib/metrics/PostGCMemoryUseRecorder.java
index 9c0b03f..2f254d2 100644
--- a/src/main/java/com/google/devtools/build/lib/metrics/PostGCMemoryUseRecorder.java
+++ b/src/main/java/com/google/devtools/build/lib/metrics/PostGCMemoryUseRecorder.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.flogger.GoogleLogger;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.ProfilerTask;
 import com.google.devtools.build.lib.runtime.BlazeModule;
@@ -227,7 +227,8 @@
     }
 
     @Override
-    public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+    public byte[] get(
+        Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
       return PostGCMemoryUseRecorder.get()
           .getPeakPostGcHeap()
           .map(peak -> print(StringUtilities.prettyPrintBytes(peak.bytes())))
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 5b78f0c..70801f5 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
@@ -353,7 +353,7 @@
 
     /**
      * Optional predicate to conditionally propagate down an attribute based on the {@link
-     * com.google.devtools.build.lib.analysis.config.BuildConfiguration}.
+     * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue}.
      *
      * <p>This is implemented specifically to support the platform-based Android toolchain
      * migration. See {@link com.google.devtools.build.lib.rules.android.DexArchiveAspect} for
@@ -363,7 +363,7 @@
      * @param propagateFunction {@link BiPredicate} that takes the aspect's build configuration and
      *     name of the attribute to propagate. If it returns true, propagates down this attribute in
      *     this configuration. We don't explicitly type with {@link
-     *     com.google.devtools.build.lib.analysis.config.BuildConfiguration} because {@link
+     *     com.google.devtools.build.lib.analysis.config.BuildConfigurationValue} because {@link
      *     AspectDefinition} is a loading phase class, with no access to config symbols.
      */
     public Builder propagateViaAttribute(BiPredicate<Object, String> propagateFunction) {
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 ef633e1..743f4e0 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
@@ -1471,7 +1471,8 @@
     }
   }
 
-  // TODO(b/65746853): Remove documentation about accepting BuildConfiguration when uses are cleaned
+  // TODO(b/65746853): Remove documentation about accepting BuildConfigurationValue when uses are
+  // cleaned
   // up.
   /**
    * Provider of values for late-bound attributes. See {@link Attribute#value(LateBoundDefault<?, ?
@@ -1481,8 +1482,8 @@
    * confuse users.
    *
    * @param <FragmentT> The type of value that is used to compute this value. This is usually a
-   *     subclass of BuildConfiguration.Fragment. It may also be Void to receive null, or
-   *     BuildConfiguration itself to receive the entire configuration.
+   *     subclass of BuildConfigurationValue.Fragment. It may also be Void to receive null, or
+   *     BuildConfigurationValue itself to receive the entire configuration.
    * @param <ValueT> The type of value returned by this class. Must be either {@link Void}, a {@link
    *     Label}, or a {@link List} of {@link Label} objects.
    */
@@ -1550,8 +1551,9 @@
      * <p>It may also be {@link Void} to receive null. This is rarely necessary, but can be used,
      * e.g., if the attribute is named to match an attribute in another rule which is late-bound.
      *
-     * <p>It may also be BuildConfiguration to receive the entire configuration. This is deprecated,
-     * and only necessary when the default is computed from methods of BuildConfiguration itself.
+     * <p>It may also be BuildConfigurationValue to receive the entire configuration. This is
+     * deprecated, and only necessary when the default is computed from methods of
+     * BuildConfigurationValue itself.
      */
     public final Class<FragmentT> getFragmentClass() {
       return fragmentClass;
@@ -1637,8 +1639,9 @@
      * attribute on another rule which is late-bound, use {@link #alwaysNull}.
      *
      * @param fragmentClass The fragment to receive from the target configuration. May also be
-     *     BuildConfiguration.class to receive the entire configuration (deprecated) - in this case,
-     *     you must only use methods of BuildConfiguration itself, and not use any fragments.
+     *     BuildConfigurationValue.class to receive the entire configuration (deprecated) - in this
+     *     case, you must only use methods of BuildConfigurationValue itself, and not use any
+     *     fragments.
      * @param defaultValue The default {@link Label} to return at loading time, when the
      *     configuration is not available.
      * @param resolver A function which will compute the actual value with the configuration.
@@ -1665,10 +1668,10 @@
      * dependency will be analyzed in the host configuration.
      *
      * @param fragmentClass The fragment to receive from the host configuration. May also be
-     *     BuildConfiguration.class to receive the entire configuration (deprecated) - in this case,
-     *     you must only use methods of BuildConfiguration itself, and not use any fragments. It is
-     *     very rare that a LateBoundDefault should need a host configuration fragment; use {@link
-     *     #fromTargetConfiguration} in most cases.
+     *     BuildConfigurationValue.class to receive the entire configuration (deprecated) - in this
+     *     case, you must only use methods of BuildConfigurationValue itself, and not use any
+     *     fragments. It is very rare that a LateBoundDefault should need a host configuration
+     *     fragment; use {@link #fromTargetConfiguration} in most cases.
      * @param defaultValue The default {@link Label} to return at loading time, when the
      *     configuration is not available.
      * @param resolver A function which will compute the actual value with the configuration.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java b/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java
index 0d3526b..ba83a07 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java
@@ -213,8 +213,8 @@
    * with the naming form seen in the Starlark API.
    *
    * <p>{@link
-   * com.google.devtools.build.lib.analysis.config.BuildConfiguration#getStarlarkFragmentByName} can
-   * be used to convert this to Java fragment instances.
+   * com.google.devtools.build.lib.analysis.config.BuildConfigurationValue#getStarlarkFragmentByName}
+   * can be used to convert this to Java fragment instances.
    */
   public ImmutableCollection<String> getRequiredStarlarkFragments() {
     return starlarkRequiredConfigurationFragments.values();
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD
index 32b665d..b6aa812 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -80,7 +80,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:actiongraph/v2/monolithic_output_handler",
         "//src/main/java/com/google/devtools/build/lib/skyframe:actiongraph/v2/streamed_output_handler",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_key_creator",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
         "//src/main/java/com/google/devtools/build/lib/skyframe:containing_package_lookup_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:detailed_exceptions",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
index 505298c..87cd767 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.AliasProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -103,7 +103,7 @@
       skyKey -> (ConfiguredTargetKey) skyKey.argument();
 
   protected final TopLevelConfigurations topLevelConfigurations;
-  protected final BuildConfiguration hostConfiguration;
+  protected final BuildConfigurationValue hostConfiguration;
   private final PathFragment parserPrefix;
   private final PathPackageLocator pkgPath;
   private final Supplier<WalkableGraph> walkableGraphSupplier;
@@ -116,7 +116,7 @@
       ExtendedEventHandler eventHandler,
       Iterable<QueryFunction> extraFunctions,
       TopLevelConfigurations topLevelConfigurations,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       PathFragment parserPrefix,
       PathPackageLocator pkgPath,
       Supplier<WalkableGraph> walkableGraphSupplier,
@@ -135,7 +135,7 @@
           ExtendedEventHandler eventHandler,
           OutputStream outputStream,
           SkyframeExecutor skyframeExecutor,
-          BuildConfiguration hostConfiguration,
+          BuildConfigurationValue hostConfiguration,
           @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory,
           PackageManager packageManager)
           throws QueryException, InterruptedException;
@@ -185,7 +185,7 @@
     }
   }
 
-  public BuildConfiguration getHostConfiguration() {
+  public BuildConfigurationValue getHostConfiguration() {
     return hostConfiguration;
   }
 
@@ -339,7 +339,7 @@
     // host config. This is somewhat counterintuitive and subject to change in the future but seems
     // like the best option right now.
     if (settings.contains(Setting.ONLY_TARGET_DEPS)) {
-      BuildConfiguration currentConfig = getConfiguration(target);
+      BuildConfigurationValue currentConfig = getConfiguration(target);
       if (currentConfig != null && currentConfig.isToolConfiguration()) {
         deps =
             deps.stream()
@@ -502,7 +502,7 @@
   }
 
   @Nullable
-  protected abstract BuildConfiguration getConfiguration(T target);
+  protected abstract BuildConfigurationValue getConfiguration(T target);
 
   protected abstract ConfiguredTargetKey getSkyKey(T target);
 
@@ -577,18 +577,18 @@
   public static class TopLevelConfigurations {
 
     /** A map of non-null configured top-level targets sorted by configuration checksum. */
-    private final ImmutableMap<Label, BuildConfiguration> nonNulls;
+    private final ImmutableMap<Label, BuildConfigurationValue> nonNulls;
     /**
      * {@code nonNulls} may often have many duplicate values in its value set so we store a sorted
      * set of all the non-null configurations here.
      */
-    private final ImmutableSortedSet<BuildConfiguration> nonNullConfigs;
+    private final ImmutableSortedSet<BuildConfigurationValue> nonNullConfigs;
     /** A list of null configured top-level targets. */
     private final ImmutableList<Label> nulls;
 
     public TopLevelConfigurations(
         Collection<TargetAndConfiguration> topLevelTargetsAndConfigurations) {
-      ImmutableMap.Builder<Label, BuildConfiguration> nonNullsBuilder =
+      ImmutableMap.Builder<Label, BuildConfigurationValue> nonNullsBuilder =
           ImmutableMap.builderWithExpectedSize(topLevelTargetsAndConfigurations.size());
       ImmutableList.Builder<Label> nullsBuilder = new ImmutableList.Builder<>();
       for (TargetAndConfiguration targetAndConfiguration : topLevelTargetsAndConfigurations) {
@@ -602,7 +602,7 @@
       nonNulls = nonNullsBuilder.build();
       nonNullConfigs =
           ImmutableSortedSet.copyOf(
-              Comparator.comparing(BuildConfiguration::checksum), nonNulls.values());
+              Comparator.comparing(BuildConfigurationValue::checksum), nonNulls.values());
       nulls = nullsBuilder.build();
     }
 
@@ -613,7 +613,7 @@
     // This method returns the configuration of a top-level target if it's not null-configured and
     // otherwise returns null (signifying it is null configured).
     @Nullable
-    public BuildConfiguration getConfigurationForTopLevelTarget(Label label) {
+    public BuildConfigurationValue getConfigurationForTopLevelTarget(Label label) {
       Preconditions.checkArgument(
           isTopLevelTarget(label),
           "Attempting to get top-level configuration for non-top-level target %s.",
@@ -621,7 +621,7 @@
       return nonNulls.get(label);
     }
 
-    public Iterable<BuildConfiguration> getConfigurations() {
+    public Iterable<BuildConfigurationValue> getConfigurations() {
       if (nulls.isEmpty()) {
         return nonNullConfigs;
       } else {
diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java
index 4e7ecd6..66ca6b8 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java
@@ -20,7 +20,7 @@
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -43,7 +43,6 @@
 import com.google.devtools.build.lib.query2.engine.QueryException;
 import com.google.devtools.build.lib.query2.engine.QueryExpression;
 import com.google.devtools.build.lib.query2.engine.QueryUtil.ThreadSafeMutableKeyExtractorBackedSetImpl;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.actiongraph.v2.StreamedOutputHandler;
@@ -66,7 +65,7 @@
 
   public static final ImmutableList<QueryFunction> AQUERY_FUNCTIONS = populateAqueryFunctions();
   public static final ImmutableList<QueryFunction> FUNCTIONS = populateFunctions();
-  AqueryOptions aqueryOptions;
+  private AqueryOptions aqueryOptions;
 
   private AqueryActionFilter actionFilters;
   private final KeyExtractor<ConfiguredTargetValue, ConfiguredTargetKey>
@@ -78,7 +77,7 @@
       ExtendedEventHandler eventHandler,
       Iterable<QueryFunction> extraFunctions,
       TopLevelConfigurations topLevelConfigurations,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       PathFragment parserPrefix,
       PathPackageLocator pkgPath,
       Supplier<WalkableGraph> walkableGraphSupplier,
@@ -108,7 +107,7 @@
       ExtendedEventHandler eventHandler,
       Iterable<QueryFunction> extraFunctions,
       TopLevelConfigurations topLevelConfigurations,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       PathFragment parserPrefix,
       PathPackageLocator pkgPath,
       Supplier<WalkableGraph> walkableGraphSupplier,
@@ -146,7 +145,7 @@
           ExtendedEventHandler eventHandler,
           OutputStream out,
           SkyframeExecutor skyframeExecutor,
-          BuildConfiguration hostConfiguration,
+          BuildConfigurationValue hostConfiguration,
           @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory,
           PackageManager packageManager) {
     return ImmutableList.of(
@@ -217,7 +216,7 @@
               .build());
     } else {
       ConfiguredTargetValue toReturn;
-      for (BuildConfiguration configuration : topLevelConfigurations.getConfigurations()) {
+      for (BuildConfigurationValue configuration : topLevelConfigurations.getConfigurations()) {
         toReturn =
             this.getConfiguredTargetValue(
                 ConfiguredTargetKey.builder()
@@ -257,13 +256,12 @@
 
   @Nullable
   @Override
-  protected BuildConfiguration getConfiguration(ConfiguredTargetValue configuredTargetValue) {
+  protected BuildConfigurationValue getConfiguration(ConfiguredTargetValue configuredTargetValue) {
     ConfiguredTarget target = configuredTargetValue.getConfiguredTarget();
     try {
       return target.getConfigurationKey() == null
           ? null
-          : ((BuildConfigurationValue) graph.getValue(target.getConfigurationKey()))
-              .getConfiguration();
+          : (BuildConfigurationValue) graph.getValue(target.getConfigurationKey());
     } catch (InterruptedException e) {
       throw new IllegalStateException("Unexpected interruption during aquery", e);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetAccessor.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetAccessor.java
index 2a8cd9b..84d4154 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetAccessor.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetAccessor.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainCollection;
 import com.google.devtools.build.lib.analysis.ToolchainContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.configuredtargets.OutputFileConfiguredTarget;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
@@ -42,7 +42,7 @@
 import com.google.devtools.build.lib.query2.engine.QueryExpression;
 import com.google.devtools.build.lib.query2.engine.QueryVisibility;
 import com.google.devtools.build.lib.server.FailureDetails.ConfigurableQuery;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.ToolchainContextKey;
 import com.google.devtools.build.lib.skyframe.UnloadedToolchainContext;
@@ -196,13 +196,13 @@
 
   @Nullable
   ToolchainCollection<ToolchainContext> getToolchainContexts(
-      Target target, BuildConfiguration config) {
+      Target target, BuildConfigurationValue config) {
     return getToolchainContexts(target, config, walkableGraph);
   }
 
   @Nullable
   private static ToolchainCollection<ToolchainContext> getToolchainContexts(
-      Target target, BuildConfiguration config, WalkableGraph walkableGraph) {
+      Target target, BuildConfigurationValue config, WalkableGraph walkableGraph) {
     if (!(target instanceof Rule)) {
       return null;
     }
@@ -223,7 +223,7 @@
 
     ToolchainCollection.Builder<UnloadedToolchainContext> toolchainContexts =
         ToolchainCollection.builder();
-    BuildConfigurationValue.Key configurationKey = BuildConfigurationValue.key(config);
+    BuildConfigurationKey configurationKey = config.getKey();
     try {
       for (Map.Entry<String, ExecGroup> group : execGroups.entrySet()) {
         ExecGroup execGroup = group.getValue();
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java
index 2c4ddb0..5a20e89 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java
@@ -16,6 +16,7 @@
 import static com.google.common.collect.ImmutableMap.toImmutableMap;
 
 import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -25,7 +26,7 @@
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -49,7 +50,7 @@
 import com.google.devtools.build.lib.query2.query.aspectresolvers.AspectResolver;
 import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
 import com.google.devtools.build.lib.server.FailureDetails.ConfigurableQuery;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -101,7 +102,7 @@
    * <p>This can also be used in cquery's {@code config} function to match against explicitly
    * specified configs. This, in particular, is where having user-friendly hashes is invaluable.
    */
-  private final ImmutableMap<String, BuildConfiguration> transitiveConfigurations;
+  private final ImmutableMap<String, BuildConfigurationValue> transitiveConfigurations;
 
   @Override
   protected KeyExtractor<KeyedConfiguredTarget, ConfiguredTargetKey>
@@ -114,7 +115,7 @@
       ExtendedEventHandler eventHandler,
       Iterable<QueryFunction> extraFunctions,
       TopLevelConfigurations topLevelConfigurations,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       Collection<SkyKey> transitiveConfigurationKeys,
       PathFragment parserPrefix,
       PathPackageLocator pkgPath,
@@ -142,7 +143,7 @@
       ExtendedEventHandler eventHandler,
       Iterable<QueryFunction> extraFunctions,
       TopLevelConfigurations topLevelConfigurations,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       Collection<SkyKey> transitiveConfigurationKeys,
       PathFragment parserPrefix,
       PathPackageLocator pkgPath,
@@ -175,37 +176,35 @@
   }
 
   /**
-   * Return supplied BuildConfiguration if both are equal else throw exception.
+   * Returns a supplied {@link BuildConfigurationValue} if both have the same build options,
+   * otherwise throws an exception.
    *
-   * <p>Noting the background of {@link BuildConfigurationValue.Key::toComparableString}, multiple
-   * BuildConfigurationValue.Key can correspond to the same BuildConfiguration, especially when
-   * trimming is involved.
-   *
-   * <p>Note that, in {@link getTransitiveConfigurations}, only interested in the values and
-   * throwing away the Keys. Thus, intricacies around Key fragments and options diverging not as
-   * relevant anyway.
+   * <p>Noting the background of {@link BuildConfigurationKey#toComparableString}, multiple {@link
+   * BuildConfigurationKey} instances can correspond to the same {@link BuildConfigurationValue},
+   * especially when trimming is involved. We are only interested in configurations whose options
+   * differ - intricacies around differing fragments can be disregarded.
    */
-  private static BuildConfiguration mergeEqualBuildConfiguration(
-      BuildConfiguration left, BuildConfiguration right) {
-    if (!left.equals(right)) {
-      throw new IllegalArgumentException(
-          "Non-matching configurations " + left.checksum() + ", " + right.checksum());
-    }
+  private static BuildConfigurationValue mergeEqualBuildConfiguration(
+      BuildConfigurationValue left, BuildConfigurationValue right) {
+    Preconditions.checkArgument(
+        left.getOptions().equals(right.getOptions()),
+        "Non-matching configurations: (%s, %s)",
+        left,
+        right);
     return left;
   }
 
-  private static ImmutableMap<String, BuildConfiguration> getTransitiveConfigurations(
+  private static ImmutableMap<String, BuildConfigurationValue> getTransitiveConfigurations(
       Collection<SkyKey> transitiveConfigurationKeys, WalkableGraph graph)
       throws InterruptedException {
-    // mergeEqualBuildConfiguration can only fail if two BuildConfiguration have the same
+    // mergeEqualBuildConfiguration can only fail if two BuildConfigurationValue have the same
     // checksum but are not equal. This would be a black swan event.
     return graph.getSuccessfulValues(transitiveConfigurationKeys).values().stream()
-        .map(value -> (BuildConfigurationValue) value)
-        .map(BuildConfigurationValue::getConfiguration)
-        .sorted(Comparator.comparing(BuildConfiguration::checksum))
+        .map(BuildConfigurationValue.class::cast)
+        .sorted(Comparator.comparing(BuildConfigurationValue::checksum))
         .collect(
             toImmutableMap(
-                BuildConfiguration::checksum,
+                BuildConfigurationValue::checksum,
                 Function.identity(),
                 ConfiguredTargetQueryEnvironment::mergeEqualBuildConfiguration));
   }
@@ -217,7 +216,7 @@
           ExtendedEventHandler eventHandler,
           OutputStream out,
           SkyframeExecutor skyframeExecutor,
-          BuildConfiguration hostConfiguration,
+          BuildConfigurationValue hostConfiguration,
           @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory,
           PackageManager packageManager)
           throws QueryException, InterruptedException {
@@ -329,8 +328,8 @@
    * null.
    */
   @Nullable
-  private KeyedConfiguredTarget getConfiguredTarget(Label label, BuildConfiguration configuration)
-      throws InterruptedException {
+  private KeyedConfiguredTarget getConfiguredTarget(
+      Label label, BuildConfigurationValue configuration) throws InterruptedException {
     return getValueFromKey(
         ConfiguredTargetKey.builder().setLabel(label).setConfiguration(configuration).build());
   }
@@ -352,7 +351,7 @@
   private List<KeyedConfiguredTarget> getConfiguredTargetsForConfigFunction(Label label)
       throws InterruptedException {
     ImmutableList.Builder<KeyedConfiguredTarget> ans = ImmutableList.builder();
-    for (BuildConfiguration config : transitiveConfigurations.values()) {
+    for (BuildConfigurationValue config : transitiveConfigurations.values()) {
       KeyedConfiguredTarget kct = getConfiguredTarget(label, config);
       if (kct != null) {
         ans.add(kct);
@@ -487,7 +486,7 @@
           label, topLevelConfigurations.getConfigurationForTopLevelTarget(label));
     } else {
       KeyedConfiguredTarget toReturn;
-      for (BuildConfiguration configuration : topLevelConfigurations.getConfigurations()) {
+      for (BuildConfigurationValue configuration : topLevelConfigurations.getConfigurations()) {
         toReturn = getConfiguredTarget(label, configuration);
         if (toReturn != null) {
           return toReturn;
@@ -514,12 +513,11 @@
 
   @Nullable
   @Override
-  protected BuildConfiguration getConfiguration(KeyedConfiguredTarget target) {
+  protected BuildConfigurationValue getConfiguration(KeyedConfiguredTarget target) {
     try {
       return target.getConfigurationKey() == null
           ? null
-          : ((BuildConfigurationValue) graph.getValue(target.getConfigurationKey()))
-              .getConfiguration();
+          : (BuildConfigurationValue) graph.getValue(target.getConfigurationKey());
     } catch (InterruptedException e) {
       throw new IllegalStateException("Unexpected interruption during configured target query", e);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryOptions.java
index eee019a..0d85d0d 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryOptions.java
@@ -69,8 +69,8 @@
           "Shows the configuration fragments required by a rule and its transitive "
               + "dependencies. This can be useful for evaluating how much a configured target "
               + "graph can be trimmed.")
-  // This implicitly sets the BuildConfiguration option --include_config_fragments_provider, which
-  //  makes configured targets compute the data cquery needs to enable this feature.
+  // This implicitly sets the option --include_config_fragments_provider (see CoreOptions), which
+  // makes configured targets compute the data cquery needs to enable this feature.
   public IncludeConfigFragmentsEnum showRequiredConfigFragments;
 
   @Option(
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java
index 9cb83bb..6711396 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java
@@ -15,11 +15,11 @@
 
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.query2.NamedThreadSafeOutputFormatterCallback;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import java.io.BufferedWriter;
 import java.io.IOException;
@@ -37,8 +37,8 @@
  * that is populated by child classes.
  *
  * <p>Human-readable cquery outputters should output short configuration IDs via {@link
- * #shortId(BuildConfiguration)} for easier reading. Machine-readable output, which are more focused
- * on completeness, should output full configuration checksums.
+ * #shortId(BuildConfigurationValue)} for easier reading. Machine-readable output, which are more
+ * focused on completeness, should output full configuration checksums.
  */
 public abstract class CqueryThreadsafeCallback
     extends NamedThreadSafeOutputFormatterCallback<KeyedConfiguredTarget> {
@@ -50,7 +50,7 @@
   // Skyframe calls incur a performance cost, even on cache hits. Consider this before exposing
   // direct executor access to child classes.
   private final SkyframeExecutor skyframeExecutor;
-  private final Map<BuildConfigurationValue.Key, BuildConfiguration> configCache =
+  private final Map<BuildConfigurationKey, BuildConfigurationValue> configCache =
       new ConcurrentHashMap<>();
   protected final ConfiguredTargetAccessor accessor;
 
@@ -94,7 +94,7 @@
     }
   }
 
-  protected BuildConfiguration getConfiguration(BuildConfigurationValue.Key configKey) {
+  protected BuildConfigurationValue getConfiguration(BuildConfigurationKey configKey) {
     // Experiments querying:
     //     cquery --output=graph "deps(//src:main/java/com/google/devtools/build/lib:runtime)"
     // 10 times on a warm Blaze instance show 7% less total query time when using this cache vs.
@@ -123,7 +123,7 @@
    * Returns a user-friendly configuration identifier, using special IDs for null and host
    * configurations and {@link #shortId(String)} for others.
    */
-  protected static String shortId(@Nullable BuildConfiguration config) {
+  protected static String shortId(@Nullable BuildConfigurationValue config) {
     if (config == null) {
       return "null";
     } else if (config.isHostConfiguration()) {
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/KeyedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/KeyedConfiguredTarget.java
index ed56d68..fb14222 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/KeyedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/KeyedConfiguredTarget.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import javax.annotation.Nullable;
 
@@ -49,7 +49,7 @@
 
   /** Returns the configuration key used for this KeyedConfiguredTarget. */
   @Nullable
-  public BuildConfigurationValue.Key getConfigurationKey() {
+  public BuildConfigurationKey getConfigurationKey() {
     return getConfiguredTarget().getConfigurationKey();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java
index d2c8e8a..f6cc512 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java
@@ -18,7 +18,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.configuredtargets.AbstractConfiguredTarget;
@@ -65,7 +65,7 @@
           @Param(name = "target"),
         })
     public Object buildOptions(ConfiguredTarget target) {
-      BuildConfiguration config = getConfiguration(target.getConfigurationKey());
+      BuildConfigurationValue config = getConfiguration(target.getConfigurationKey());
 
       if (config == null) {
         // config is null for input file configured targets.
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
index d3c4369..2cb3ea5 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainCollection;
 import com.google.devtools.build.lib.analysis.ToolchainContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiff;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
@@ -61,7 +61,7 @@
  */
 class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback {
 
-  protected final BuildConfiguration hostConfiguration;
+  protected final BuildConfigurationValue hostConfiguration;
 
   private final HashMap<Label, Target> partialResultMap;
   @Nullable private final TransitionFactory<RuleTransitionData> trimmingTransitionFactory;
@@ -81,7 +81,7 @@
       OutputStream out,
       SkyframeExecutor skyframeExecutor,
       TargetAccessor<KeyedConfiguredTarget> accessor,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       @Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory) {
     super(eventHandler, options, out, skyframeExecutor, accessor);
     this.hostConfiguration = hostConfiguration;
@@ -103,7 +103,8 @@
     partialResult.forEach(kct -> partialResultMap.put(kct.getLabel(), accessor.getTarget(kct)));
     for (KeyedConfiguredTarget keyedConfiguredTarget : partialResult) {
       Target target = partialResultMap.get(keyedConfiguredTarget.getLabel());
-      BuildConfiguration config = getConfiguration(keyedConfiguredTarget.getConfigurationKey());
+      BuildConfigurationValue config =
+          getConfiguration(keyedConfiguredTarget.getConfigurationKey());
       addResult(
           getRuleClassTransition(keyedConfiguredTarget.getConfiguredTarget(), target)
               + String.format(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
index d4821b7..123ad61 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import javax.annotation.Nullable;
@@ -47,7 +47,7 @@
 @Immutable
 public final class AliasConfiguredTarget implements ConfiguredTarget, Structure {
   private final Label label;
-  private final BuildConfigurationValue.Key configurationKey;
+  private final BuildConfigurationKey configurationKey;
   private final ConfiguredTarget actual;
   private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
       overrides;
@@ -69,7 +69,7 @@
   @VisibleForSerialization
   AliasConfiguredTarget(
       Label label,
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       ConfiguredTarget actual,
       ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> overrides,
       ImmutableMap<Label, ConfigMatchingProvider> configConditions) {
@@ -126,7 +126,7 @@
   }
 
   @Override
-  public BuildConfigurationValue.Key getConfigurationKey() {
+  public BuildConfigurationKey getConfigurationKey() {
     // This does not return actual.getConfigurationKey() because actual might be an input file, in
     // which case its configurationKey is null and we don't want to have rules that have a null
     // configurationKey.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/BUILD b/src/main/java/com/google/devtools/build/lib/rules/BUILD
index cbc3927..ac40eb4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/BUILD
@@ -166,7 +166,7 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/net/starlark/java/eval",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java b/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java
index da58df1..150b059 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java
@@ -19,7 +19,7 @@
 import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
 import com.google.devtools.build.lib.packages.BuildSetting;
@@ -50,10 +50,10 @@
  */
 public class LabelBuildSettings {
   @AutoCodec @VisibleForSerialization
-  // TODO(b/65746853): find a way to do this without passing the entire BuildConfiguration
-  static final LabelLateBoundDefault<BuildConfiguration> ACTUAL =
+  // TODO(b/65746853): find a way to do this without passing the entire BuildConfigurationValue
+  static final LabelLateBoundDefault<BuildConfigurationValue> ACTUAL =
       LabelLateBoundDefault.fromTargetConfiguration(
-          BuildConfiguration.class,
+          BuildConfigurationValue.class,
           null,
           (rule, attributes, configuration) -> {
             if (rule == null || configuration == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index baf79c0..518be54 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -56,7 +56,7 @@
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate;
 import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate.OutputPathMapper;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -126,7 +126,7 @@
   public final void addRuleImplSpecificRequiredConfigFragments(
       RequiredConfigFragmentsProvider.Builder requiredFragments,
       AttributeMap attributes,
-      BuildConfiguration configuration) {
+      BuildConfigurationValue configuration) {
     requiredFragments.addStarlarkOptions(AndroidFeatureFlagSetProvider.getFeatureFlags(attributes));
   }
 
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 eb2750b..8657db8 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
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.analysis.actions.Substitution;
 import com.google.devtools.build.lib.analysis.actions.Template;
 import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -412,7 +412,7 @@
   public final void addRuleImplSpecificRequiredConfigFragments(
       RequiredConfigFragmentsProvider.Builder requiredFragments,
       AttributeMap attributes,
-      BuildConfiguration configuration) {
+      BuildConfigurationValue configuration) {
     requiredFragments.addStarlarkOptions(AndroidFeatureFlagSetProvider.getFeatureFlags(attributes));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java
index ce5a845..b95d3cd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.analysis.ResolvedToolchainContext;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -123,7 +123,7 @@
    * --incompatible_enable_android_toolchain_resolution=true, else, uses the legacy attribute..
    */
   public static AndroidSdkProvider fromRuleContext(RuleContext ruleContext) {
-    BuildConfiguration configuration = ruleContext.getConfiguration();
+    BuildConfigurationValue configuration = ruleContext.getConfiguration();
     if (configuration != null
         && configuration.hasFragment(AndroidConfiguration.class)
         && configuration
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index f81fbd5..6f547c2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -43,7 +43,7 @@
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -161,7 +161,7 @@
       return true;
     }
     AndroidConfiguration androidConfig =
-        ((BuildConfiguration) obj).getFragment(AndroidConfiguration.class);
+        ((BuildConfigurationValue) obj).getFragment(AndroidConfiguration.class);
     return !androidConfig.incompatibleUseToolchainResolution();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
index 7778438..63a1951 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -48,7 +48,7 @@
   public static final NativeLibs EMPTY = new NativeLibs(ImmutableMap.of(), null);
 
   private static String getLibDirName(ConfiguredTargetAndData dep) {
-    BuildConfiguration configuration = dep.getConfiguration();
+    BuildConfigurationValue configuration = dep.getConfiguration();
     AndroidConfiguration androidConfiguration =
         configuration.getFragment(AndroidConfiguration.class);
     String name;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
index 28e5db9..87db045 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
@@ -41,8 +41,8 @@
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationOptionDetails;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions.SelectRestriction;
@@ -148,7 +148,7 @@
   public void addRuleImplSpecificRequiredConfigFragments(
       RequiredConfigFragmentsProvider.Builder requiredFragments,
       AttributeMap attributes,
-      BuildConfiguration configuration) {
+      BuildConfigurationValue configuration) {
     // values
     attributes
         .get(ConfigSettingRule.SETTINGS_ATTRIBUTE, Type.STRING_DICT)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 5a09880..42873ca 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
 import com.google.devtools.build.lib.analysis.stringtemplate.ExpansionException;
@@ -896,7 +896,7 @@
 
   public static FeatureConfiguration configureFeaturesOrReportRuleError(
       RuleContext ruleContext,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       ImmutableSet<String> requestedFeatures,
       ImmutableSet<String> unsupportedFeatures,
       CcToolchainProvider toolchain,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
index 297402a..dbfb20d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.analysis.AnalysisUtils;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.compacthashmap.CompactHashMap;
 import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet;
@@ -726,7 +726,7 @@
   /** Creates a new builder for a {@link CcCompilationContext} instance. */
   public static Builder builder(
       ActionConstructionContext actionConstructionContext,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Label label) {
     return new Builder(actionConstructionContext, configuration, label);
   }
@@ -763,13 +763,13 @@
     /** The rule that owns the context */
     private final ActionConstructionContext actionConstructionContext;
 
-    private final BuildConfiguration configuration;
+    private final BuildConfigurationValue configuration;
     private final Label label;
 
     /** Creates a new builder for a {@link CcCompilationContext} instance. */
     private Builder(
         ActionConstructionContext actionConstructionContext,
-        BuildConfiguration configuration,
+        BuildConfigurationValue configuration,
         Label label) {
       this.actionConstructionContext = actionConstructionContext;
       this.configuration = configuration;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index 5f547b8..6a0b0ad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.PerLabelOptions;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -231,7 +231,7 @@
   }
 
   private final CppSemantics semantics;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private final ImmutableMap<String, String> executionInfo;
   private final CppConfiguration cppConfiguration;
   private final boolean shouldProcessHeaders;
@@ -299,7 +299,7 @@
       SourceCategory sourceCategory,
       CcToolchainProvider ccToolchain,
       FdoContext fdoContext,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       ImmutableMap<String, String> executionInfo,
       boolean shouldProcessHeaders) {
     this.semantics = Preconditions.checkNotNull(semantics);
@@ -2038,7 +2038,7 @@
 
   /** Returns true iff code coverage is enabled for the given target. */
   public static boolean isCodeCoverageEnabled(RuleContext ruleContext) {
-    BuildConfiguration configuration = ruleContext.getConfiguration();
+    BuildConfigurationValue configuration = ruleContext.getConfiguration();
     if (configuration.isCodeCoverageEnabled()) {
       // If rule is matched by the instrumentation filter, enable instrumentation
       if (InstrumentedFilesCollector.shouldIncludeLocalSources(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index 200330e..c7bd53e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -582,7 +582,7 @@
       RuleContext ruleContext,
       CcToolchainProvider ccToolchain,
       CppConfiguration cppConfiguration,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CcCompilationOutputs ccCompilationOutputs,
       FeatureConfiguration featureConfiguration)
       throws RuleErrorException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index 971f383..44beb92 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -85,7 +85,7 @@
   }
 
   private final CppSemantics semantics;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private final CppConfiguration cppConfiguration;
 
   private final NestedSetBuilder<Artifact> additionalLinkerInputsBuilder =
@@ -156,7 +156,7 @@
       FeatureConfiguration featureConfiguration,
       CcToolchainProvider ccToolchain,
       FdoContext fdoContext,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CppConfiguration cppConfiguration,
       SymbolGenerator<?> symbolGenerator,
       ImmutableMap<String, String> executionInfo) {
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 b3a5b95..324503b 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
@@ -26,7 +26,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkActionFactory;
@@ -1943,7 +1943,7 @@
     }
   }
 
-  private static boolean isStampingEnabled(int stamp, BuildConfiguration config)
+  private static boolean isStampingEnabled(int stamp, BuildConfigurationValue config)
       throws EvalException {
     if (stamp == 0) {
       return false;
@@ -2093,7 +2093,8 @@
     SourceCategory sourceCategory =
         (language == Language.CPP) ? SourceCategory.CC : SourceCategory.CC_AND_OBJC;
     CcCommon common = new CcCommon(actions.getRuleContext(), ccToolchainProvider);
-    BuildConfiguration configuration = actions.getActionConstructionContext().getConfiguration();
+    BuildConfigurationValue configuration =
+        actions.getActionConstructionContext().getConfiguration();
     CcCompilationHelper helper =
         new CcCompilationHelper(
             actions.asActionRegistry(actions),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index a563651..f9f4b8c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.LicensesProvider;
 import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
@@ -796,9 +796,9 @@
   }
 
   /**
-   * Returns a map of additional make variables for use by {@link BuildConfiguration}. These are to
-   * used to allow some build rules to avoid the limits on stack frame sizes and variable-length
-   * arrays.
+   * Returns a map of additional make variables for use by {@link BuildConfigurationValue}. These
+   * are to used to allow some build rules to avoid the limits on stack frame sizes and
+   * variable-length arrays.
    *
    * <p>The returned map must contain an entry for {@code STACK_FRAME_UNLIMITED}, though the entry
    * may be an empty string.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
index bc5e444..5c448c9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -62,7 +62,8 @@
   public static CcToolchainProvider getCcToolchainProvider(
       RuleContext ruleContext, CcToolchainAttributesProvider attributes)
       throws RuleErrorException, InterruptedException {
-    BuildConfiguration configuration = Preconditions.checkNotNull(ruleContext.getConfiguration());
+    BuildConfigurationValue configuration =
+        Preconditions.checkNotNull(ruleContext.getConfiguration());
     CppConfiguration cppConfiguration =
         Preconditions.checkNotNull(configuration.getFragment(CppConfiguration.class));
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
index 4939948..a82be97 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -47,7 +47,7 @@
   @Override
   public BuildInfoCollection create(
       BuildInfoContext buildInfoContext,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       Artifact buildInfo,
       Artifact buildChangelist) {
     List<Action> actions = new ArrayList<>();
@@ -86,7 +86,7 @@
 
   private WriteBuildInfoHeaderAction getHeader(
       BuildInfoContext buildInfoContext,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       PathFragment headerName,
       NestedSet<Artifact> inputs,
       boolean writeVolatileInfo,
@@ -109,7 +109,7 @@
   }
 
   @Override
-  public boolean isEnabled(BuildConfiguration config) {
+  public boolean isEnabled(BuildConfigurationValue config) {
     return config.hasFragment(CppConfiguration.class);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index 207a8d5..5ccf6a4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -49,7 +49,7 @@
 
   private final ActionOwner owner;
   private boolean shareable;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private CcToolchainFeatures.FeatureConfiguration featureConfiguration;
   private CcToolchainVariables variables = CcToolchainVariables.EMPTY;
   private Artifact sourceFile;
@@ -88,7 +88,7 @@
       ActionConstructionContext actionConstructionContext,
       @Nullable Artifact grepIncludes,
       CcToolchainProvider ccToolchain,
-      BuildConfiguration configuration) {
+      BuildConfigurationValue configuration) {
     this.owner = actionConstructionContext.getActionOwner();
     this.shareable = false;
     this.configuration = configuration;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 28146f4..e8a2ed3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -20,7 +20,7 @@
 import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
@@ -52,7 +52,7 @@
 import net.starlark.java.eval.StarlarkThread;
 
 /**
- * This class represents the C/C++ parts of the {@link BuildConfiguration}, including the host
+ * This class represents the C/C++ parts of the {@link BuildConfigurationValue}, including the host
  * architecture, target architecture, compiler version, and a standard library version.
  */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index 1a374f5..2c32ffd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -46,7 +46,7 @@
 import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -462,7 +462,7 @@
   public static Artifact getLinkedArtifact(
       RuleContext ruleContext,
       CcToolchainProvider ccToolchain,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       LinkTargetType linkType)
       throws RuleErrorException {
     return getLinkedArtifact(
@@ -473,7 +473,7 @@
   public static Artifact getLinkedArtifact(
       RuleContext ruleContext,
       CcToolchainProvider ccToolchain,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       LinkTargetType linkType,
       String linkedArtifactNameSuffix)
       throws RuleErrorException {
@@ -506,7 +506,7 @@
       Label label,
       ActionConstructionContext actionConstructionContext,
       ArtifactRoot artifactRoot,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       LinkTargetType linkType,
       String linkedArtifactNameSuffix,
       PathFragment name) {
@@ -535,7 +535,7 @@
   private static Artifact getLinuxLinkedArtifact(
       Label label,
       ActionConstructionContext actionConstructionContext,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       LinkTargetType linkType,
       String linkedArtifactNameSuffix) {
     PathFragment name = PathFragment.create(label.getName());
@@ -591,7 +591,7 @@
    */
   public static CppModuleMap createDefaultCppModuleMap(
       ActionConstructionContext actionConstructionContext,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Label label) {
     // Create the module map artifact as a genfile.
     Artifact mapFile =
@@ -722,7 +722,7 @@
       ActionConstructionContext actionConstructionContext,
       Label label,
       String outputName,
-      BuildConfiguration config) {
+      BuildConfigurationValue config) {
     PathFragment objectDir = getObjDirectory(label, config.isSiblingRepositoryLayout());
     return actionConstructionContext.getDerivedArtifact(
         objectDir.getRelative(outputName), config.getBinDirectory(label.getRepository()));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
index e5a43dd..fed62b0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.actions.extra.CppLinkInfo;
 import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.starlark.Args;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -89,7 +89,7 @@
     Artifact create(
         ActionConstructionContext actionConstructionContext,
         RepositoryName repositoryName,
-        BuildConfiguration configuration,
+        BuildConfigurationValue configuration,
         PathFragment rootRelativePath);
   }
 
@@ -103,7 +103,7 @@
         public Artifact create(
             ActionConstructionContext actionConstructionContext,
             RepositoryName repositoryName,
-            BuildConfiguration configuration,
+            BuildConfigurationValue configuration,
             PathFragment rootRelativePath) {
           return actionConstructionContext.getDerivedArtifact(
               rootRelativePath, configuration.getBinDirectory(repositoryName));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index d807f2e..232187e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
 import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.PerLabelOptions;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
@@ -78,7 +78,7 @@
         public Artifact create(
             ActionConstructionContext actionConstructionContext,
             RepositoryName repositoryName,
-            BuildConfiguration configuration,
+            BuildConfigurationValue configuration,
             PathFragment rootRelativePath) {
           return actionConstructionContext.getShareableArtifact(
               rootRelativePath, configuration.getBinDirectory(repositoryName));
@@ -98,7 +98,7 @@
   /** Directory where toolchain stores language-runtime libraries (libstdc++, libc++ ...) */
   private PathFragment toolchainLibrariesSolibDir;
 
-  protected final BuildConfiguration configuration;
+  protected final BuildConfigurationValue configuration;
   private final CppConfiguration cppConfiguration;
   private FeatureConfiguration featureConfiguration;
 
@@ -164,7 +164,7 @@
       ActionConstructionContext actionConstructionContext,
       Label label,
       Artifact output,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CcToolchainProvider toolchain,
       FdoContext fdoContext,
       FeatureConfiguration featureConfiguration,
@@ -1114,7 +1114,7 @@
       ImmutableSet<Linkstamp> linkstamps,
       ActionConstructionContext actionConstructionContext,
       RepositoryName repositoryName,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Artifact outputBinary,
       LinkArtifactFactory linkArtifactFactory) {
     ImmutableMap.Builder<Linkstamp, Artifact> mapBuilder = ImmutableMap.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java
index 18e5761..a13b80d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -43,7 +43,7 @@
       RuleErrorConsumer ruleErrorConsumer,
       ActionConstructionContext actionConstructionContext,
       @Nullable Artifact grepIncludes,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       Artifact sourceFile,
       Artifact outputFile,
       NestedSet<Artifact> compilationInputs,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
index aa8a3ba..19eb661 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -34,7 +34,7 @@
    * minute.
    */
   void finalizeCompileActionBuilder(
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       FeatureConfiguration featureConfiguration,
       CppCompileActionBuilder actionBuilder,
       RuleErrorConsumer ruleErrorConsumer);
@@ -54,7 +54,7 @@
   boolean allowIncludeScanning();
 
   /** Returns true iff this build should perform .d input pruning. */
-  boolean needsDotdInputPruning(BuildConfiguration configuration);
+  boolean needsDotdInputPruning(BuildConfigurationValue configuration);
 
   void validateAttributes(RuleContext ruleContext);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoHelper.java
index 72067af..1330f91 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoHelper.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -40,7 +40,7 @@
   public static FdoContext getFdoContext(
       RuleContext ruleContext,
       CcToolchainAttributesProvider attributes,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CppConfiguration cppConfiguration,
       ImmutableMap<String, PathFragment> toolPaths)
       throws InterruptedException, RuleErrorException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java
index e1620c4..6acc1e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.actions.ResourceSetOrBuilder;
 import com.google.devtools.build.lib.actions.RunfilesSupplier;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -265,7 +265,7 @@
         CommandLineLimits commandLineLimits,
         boolean isShellCommand,
         ActionEnvironment env,
-        @Nullable BuildConfiguration configuration,
+        @Nullable BuildConfigurationValue configuration,
         ImmutableMap<String, String> executionInfo,
         CharSequence progressMessage,
         RunfilesSupplier runfilesSupplier,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
index 245bac5..10b4fa4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
@@ -91,7 +91,7 @@
       BitcodeFiles allBitcodeFiles,
       ActionConstructionContext actionConstructionContext,
       RepositoryName repositoryName,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       LinkArtifactFactory linkArtifactFactory,
       FeatureConfiguration featureConfiguration,
       CcToolchainProvider ccToolchain,
@@ -146,7 +146,7 @@
       Artifact bitcodeFile,
       ActionConstructionContext actionConstructionContext,
       RepositoryName repositoryName,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       LinkArtifactFactory linkArtifactFactory,
       FeatureConfiguration featureConfiguration,
       CcToolchainProvider ccToolchain,
@@ -222,7 +222,7 @@
       FdoContext fdoContext,
       boolean usePic,
       boolean generateDwo,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       LinkArtifactFactory linkArtifactFactory,
       List<String> userCompileFlags,
       @Nullable BitcodeFiles bitcodeFiles)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ObjcCppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ObjcCppSemantics.java
index e15df2c..a002ac5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ObjcCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ObjcCppSemantics.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -35,7 +35,7 @@
 
   @Override
   public void finalizeCompileActionBuilder(
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       FeatureConfiguration featureConfiguration,
       CppCompileActionBuilder actionBuilder,
       RuleErrorConsumer ruleErrorConsumer) {
@@ -96,7 +96,7 @@
   }
 
   @Override
-  public boolean needsDotdInputPruning(BuildConfiguration configuration) {
+  public boolean needsDotdInputPruning(BuildConfigurationValue configuration) {
     return configuration.getFragment(CppConfiguration.class).objcShouldGenerateDotdFiles();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
index bfd2ce2..c5371ae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
@@ -53,7 +53,7 @@
   public ConfiguredTarget create(RuleContext ruleContext)
       throws InterruptedException, RuleErrorException, ActionConflictException {
     String outputGroupName = ruleContext.attributes().get("output_group", Type.STRING);
-    BuildConfiguration configuration = checkNotNull(ruleContext.getConfiguration());
+    BuildConfigurationValue configuration = checkNotNull(ruleContext.getConfiguration());
     if (outputGroupName.endsWith(INTERNAL_SUFFIX)) {
       ruleContext.throwWithAttributeError(
           "output_group", String.format(ILLEGAL_OUTPUT_GROUP_ERROR, outputGroupName));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
index 0098c67..b0b8c5b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -71,7 +71,7 @@
   @Override
   public final BuildInfoCollection create(
       BuildInfoContext context,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       Artifact stableStatus,
       Artifact volatileStatus) {
     WriteBuildInfoPropertiesAction redactedInfo =
@@ -130,7 +130,7 @@
 
   private WriteBuildInfoPropertiesAction getHeader(
       BuildInfoContext context,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       PathFragment propertyFileName,
       NestedSet<Artifact> inputs,
       BuildInfoPropertiesTranslator translator,
@@ -154,7 +154,7 @@
   }
 
   @Override
-  public boolean isEnabled(BuildConfiguration config) {
+  public boolean isEnabled(BuildConfigurationValue config) {
     return config.hasFragment(JavaConfiguration.class);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index f0e1407..86f0388 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
 import com.google.devtools.build.lib.analysis.actions.LazyWritePathsFileAction;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.StrictDepsMode;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -139,7 +139,7 @@
     return ruleContext.getAnalysisEnvironment();
   }
 
-  private BuildConfiguration getConfiguration() {
+  private BuildConfigurationValue getConfiguration() {
     return ruleContext.getConfiguration();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index 84fffad..9b2fb11 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -57,7 +57,7 @@
 import com.google.devtools.build.lib.actions.SpawnResult;
 import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.starlark.Args;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -126,7 +126,7 @@
   private final ImmutableMap<String, String> executionInfo;
   private final CommandLine executableLine;
   private final CommandLine flagLine;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private final OnDemandString progressMessage;
 
   private final NestedSet<Artifact> directJars;
@@ -153,7 +153,7 @@
       ExtraActionInfoSupplier extraActionInfoSupplier,
       CommandLine executableLine,
       CommandLine flagLine,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       NestedSet<Artifact> dependencyArtifacts,
       Artifact outputDepsProto,
       JavaClasspathMode classpathMode) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
index 58301d0..86c3228 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -38,14 +38,14 @@
 /** Implementation for the {@code java_runtime} rule. */
 public class JavaRuntime implements RuleConfiguredTargetFactory {
   // TODO(lberki): This is incorrect but that what the Jvm configuration fragment did. We'd have the
-  // the ability to do better if we knew what OS the BuildConfiguration refers to.
+  // the ability to do better if we knew what OS the BuildConfigurationValue refers to.
   private static final String BIN_JAVA = "bin/java" + OsUtils.executableExtension();
 
   @Override
   public ConfiguredTarget create(RuleContext ruleContext)
       throws InterruptedException, RuleErrorException, ActionConflictException {
     NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder();
-    BuildConfiguration configuration = checkNotNull(ruleContext.getConfiguration());
+    BuildConfigurationValue configuration = checkNotNull(ruleContext.getConfiguration());
     filesBuilder.addTransitive(PrerequisiteArtifacts.nestedSet(ruleContext, "srcs"));
     boolean siblingRepositoryLayout = configuration.isSiblingRepositoryLayout();
     PathFragment javaHome = defaultJavaHome(ruleContext.getLabel(), siblingRepositoryLayout);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index d9647eb..4edb1a7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -83,7 +83,7 @@
         public Artifact create(
             ActionConstructionContext actionConstructionContext,
             RepositoryName repositoryName,
-            BuildConfiguration configuration,
+            BuildConfigurationValue configuration,
             PathFragment rootRelativePath) {
           return actionConstructionContext.getShareableArtifact(
               rootRelativePath, configuration.getBinDirectory(repositoryName));
@@ -119,7 +119,7 @@
   public static Artifact linkAndroidNativeDepsIfPresent(
       final RuleContext ruleContext,
       CcInfo ccInfo,
-      final BuildConfiguration configuration,
+      final BuildConfigurationValue configuration,
       CcToolchainProvider toolchain,
       CppSemantics cppSemantics)
       throws InterruptedException, RuleErrorException {
@@ -183,7 +183,7 @@
       final RuleContext ruleContext,
       CcInfo ccInfo,
       Collection<String> extraLinkOpts,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CcToolchainProvider toolchain,
       Artifact nativeDeps,
       ArtifactRoot bindirIfShared,
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 8598d83..1575b32 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
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -198,7 +198,7 @@
     ImmutableListMultimap<String, TransitiveInfoCollection> cpuToDepsCollectionMap =
         MultiArchBinarySupport.transformMap(ruleContext.getPrerequisitesByConfiguration("deps"));
 
-    ImmutableMap<BuildConfiguration, CcToolchainProvider> childConfigurationsAndToolchains =
+    ImmutableMap<BuildConfigurationValue, CcToolchainProvider> childConfigurationsAndToolchains =
         MultiArchBinarySupport.getChildConfigurationsAndToolchains(ruleContext);
     MultiArchBinarySupport multiArchBinarySupport =
         new MultiArchBinarySupport(ruleContext, cppSemantics);
@@ -220,10 +220,10 @@
     allLinkInputs.addAll(extraLinkInputs);
     allLinkopts.addAll(extraLinkopts);
 
-    ImmutableListMultimap<BuildConfiguration, CcInfo> buildConfigToCcInfoMap =
+    ImmutableListMultimap<BuildConfigurationValue, CcInfo> buildConfigToCcInfoMap =
         ruleContext.getPrerequisitesByConfiguration("deps", CcInfo.PROVIDER);
     NestedSetBuilder<Artifact> headerTokens = NestedSetBuilder.stableOrder();
-    for (Map.Entry<BuildConfiguration, CcInfo> entry : buildConfigToCcInfoMap.entries()) {
+    for (Map.Entry<BuildConfigurationValue, CcInfo> entry : buildConfigToCcInfoMap.entries()) {
       CcInfo dep = entry.getValue();
       headerTokens.addTransitive(dep.getCcCompilationContext().getHeaderTokens());
     }
@@ -244,7 +244,7 @@
 
     for (DependencySpecificConfiguration dependencySpecificConfiguration :
         dependencySpecificConfigurations) {
-      BuildConfiguration childConfig = dependencySpecificConfiguration.config();
+      BuildConfigurationValue childConfig = dependencySpecificConfiguration.config();
       String configCpu = childConfig.getCpu();
       AppleConfiguration childAppleConfig = childConfig.getFragment(AppleConfiguration.class);
       CppConfiguration childCppConfig = childConfig.getFragment(CppConfiguration.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java
index 5ba06e9..701286b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.transitions.StarlarkExposedRuleTransitionFactory;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
@@ -357,7 +357,7 @@
     return StarlarkInfo.create(linkingOutputsConstructor, fields.build(), Location.BUILTIN);
   }
 
-  private static boolean isStampingEnabled(int stamp, BuildConfiguration config)
+  private static boolean isStampingEnabled(int stamp, BuildConfigurationValue config)
       throws EvalException {
     if (stamp == 0) {
       return false;
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 dcd1d09..2cb24fd 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
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
@@ -81,7 +81,7 @@
         MultiArchBinarySupport.transformMap(
             ruleContext.getPrerequisitesByConfiguration(AVOID_DEPS_ATTR_NAME, CcInfo.PROVIDER));
 
-    Map<BuildConfiguration, CcToolchainProvider> childConfigurationsAndToolchains =
+    Map<BuildConfigurationValue, CcToolchainProvider> childConfigurationsAndToolchains =
         MultiArchBinarySupport.getChildConfigurationsAndToolchains(ruleContext);
     IntermediateArtifacts ruleIntermediateArtifacts =
         ObjcRuleClasses.intermediateArtifacts(ruleContext);
@@ -96,9 +96,9 @@
         new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getStarlarkSemantics());
 
     Map<String, NestedSet<Artifact>> outputGroupCollector = new TreeMap<>();
-    for (Map.Entry<BuildConfiguration, CcToolchainProvider> entry :
+    for (Map.Entry<BuildConfigurationValue, CcToolchainProvider> entry :
         childConfigurationsAndToolchains.entrySet()) {
-      BuildConfiguration childToolchainConfig = entry.getKey();
+      BuildConfigurationValue childToolchainConfig = entry.getKey();
       String childCpu = entry.getKey().getCpu();
       CcToolchainProvider childToolchain = entry.getValue();
 
@@ -134,10 +134,10 @@
       addTransitivePropagatedKeys(objcProviderBuilder, objcProvider);
     }
 
-    ImmutableListMultimap<BuildConfiguration, CcInfo> buildConfigToCcInfoMap =
+    ImmutableListMultimap<BuildConfigurationValue, CcInfo> buildConfigToCcInfoMap =
         ruleContext.getPrerequisitesByConfiguration("deps", CcInfo.PROVIDER);
     NestedSetBuilder<Artifact> headerTokens = NestedSetBuilder.stableOrder();
-    for (Map.Entry<BuildConfiguration, CcInfo> entry : buildConfigToCcInfoMap.entries()) {
+    for (Map.Entry<BuildConfigurationValue, CcInfo> entry : buildConfigToCcInfoMap.entries()) {
       CcInfo dep = entry.getValue();
       headerTokens.addTransitive(dep.getCcCompilationContext().getHeaderTokens());
     }
@@ -184,7 +184,7 @@
 
   private ObjcCommon common(
       RuleContext ruleContext,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       IntermediateArtifacts intermediateArtifacts,
       List<TransitiveInfoCollection> propagatedDeps)
       throws InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 49d8f0b..007c35c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -55,7 +55,7 @@
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
 import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector;
@@ -179,7 +179,7 @@
   private FeatureConfiguration getFeatureConfiguration(
       RuleContext ruleContext,
       CcToolchainProvider ccToolchain,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CppSemantics cppSemantics) {
     ImmutableSet.Builder<String> activatedCrosstoolSelectables =
         ImmutableSet.<String>builder()
@@ -287,7 +287,7 @@
   }
 
   private final RuleContext ruleContext;
-  private final BuildConfiguration buildConfiguration;
+  private final BuildConfigurationValue buildConfiguration;
   private final ObjcConfiguration objcConfiguration;
   private final AppleConfiguration appleConfiguration;
   private final CppSemantics cppSemantics;
@@ -319,7 +319,7 @@
    */
   private CompilationSupport(
       RuleContext ruleContext,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       CppSemantics cppSemantics,
       IntermediateArtifacts intermediateArtifacts,
       CompilationAttributes compilationAttributes,
@@ -356,7 +356,7 @@
   public static class Builder {
     private final RuleContext ruleContext;
     private final CppSemantics cppSemantics;
-    private BuildConfiguration buildConfiguration;
+    private BuildConfigurationValue buildConfiguration;
     private IntermediateArtifacts intermediateArtifacts;
     private CompilationAttributes compilationAttributes;
     private CcToolchainProvider toolchain;
@@ -368,8 +368,8 @@
       this.cppSemantics = cppSemantics;
     }
 
-    /** Sets the {@link BuildConfiguration} for the calling target. */
-    public Builder setConfig(BuildConfiguration buildConfiguration) {
+    /** Sets the {@link BuildConfigurationValue} for the calling target. */
+    public Builder setConfig(BuildConfigurationValue buildConfiguration) {
       this.buildConfiguration = buildConfiguration;
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
index 017f1e5..01cea42 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
@@ -36,7 +36,7 @@
   static final String LINKMAP_SUFFIX = ".linkmap";
 
   private final RuleContext ruleContext;
-  private final BuildConfiguration buildConfiguration;
+  private final BuildConfigurationValue buildConfiguration;
   private final String archiveFileNameSuffix;
   private final String outputPrefix;
   private final UmbrellaHeaderStrategy umbrellaHeaderStrategy;
@@ -76,7 +76,7 @@
       RuleContext ruleContext,
       String archiveFileNameSuffix,
       String outputPrefix,
-      BuildConfiguration buildConfiguration) {
+      BuildConfigurationValue buildConfiguration) {
     this(
         ruleContext,
         archiveFileNameSuffix,
@@ -89,7 +89,7 @@
       RuleContext ruleContext,
       String archiveFileNameSuffix,
       String outputPrefix,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       UmbrellaHeaderStrategy umbrellaHeaderStrategy) {
     this.ruleContext = ruleContext;
     this.buildConfiguration = buildConfiguration;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
index 6215191..e520ea1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
@@ -49,14 +49,15 @@
    * Returns all child configurations for this multi-arch target, mapped to the toolchains that they
    * should use.
    */
-  static ImmutableMap<BuildConfiguration, CcToolchainProvider> getChildConfigurationsAndToolchains(
-      RuleContext ruleContext) {
-    ImmutableListMultimap<BuildConfiguration, CcToolchainProvider> configToProvider =
+  static ImmutableMap<BuildConfigurationValue, CcToolchainProvider>
+      getChildConfigurationsAndToolchains(RuleContext ruleContext) {
+    ImmutableListMultimap<BuildConfigurationValue, CcToolchainProvider> configToProvider =
         ruleContext.getPrerequisitesByConfiguration(
             ObjcRuleClasses.CHILD_CONFIG_ATTR, CcToolchainProvider.PROVIDER);
 
-    ImmutableMap.Builder<BuildConfiguration, CcToolchainProvider> result = ImmutableMap.builder();
-    for (BuildConfiguration config : configToProvider.keySet()) {
+    ImmutableMap.Builder<BuildConfigurationValue, CcToolchainProvider> result =
+        ImmutableMap.builder();
+    for (BuildConfigurationValue config : configToProvider.keySet()) {
       CcToolchainProvider toolchain = Iterables.getOnlyElement(configToProvider.get(config));
       result.put(config, toolchain);
     }
@@ -64,9 +65,10 @@
     return result.build();
   }
 
-  static <V> ImmutableListMultimap<String, V> transformMap(Multimap<BuildConfiguration, V> input) {
+  static <V> ImmutableListMultimap<String, V> transformMap(
+      Multimap<BuildConfigurationValue, V> input) {
     ImmutableListMultimap.Builder<String, V> result = ImmutableListMultimap.builder();
-    for (Map.Entry<BuildConfiguration, V> entry : input.entries()) {
+    for (Map.Entry<BuildConfigurationValue, V> entry : input.entries()) {
       result.put(entry.getKey().getCpu(), entry.getValue());
     }
 
@@ -77,7 +79,7 @@
   @AutoValue
   abstract static class DependencySpecificConfiguration {
     static DependencySpecificConfiguration create(
-        BuildConfiguration config,
+        BuildConfigurationValue config,
         CcToolchainProvider toolchain,
         ObjcProvider objcLinkProvider,
         ObjcProvider objcPropagateProvider) {
@@ -86,7 +88,7 @@
     }
 
     /** Returns the child configuration for this tuple. */
-    abstract BuildConfiguration config();
+    abstract BuildConfigurationValue config();
 
     /** Returns the cc toolchain for this configuration. */
     abstract CcToolchainProvider toolchain();
@@ -189,14 +191,14 @@
    * @throws RuleErrorException if there are attribute errors in the current rule context
    */
   public ImmutableSet<DependencySpecificConfiguration> getDependencySpecificConfigurations(
-      Map<BuildConfiguration, CcToolchainProvider> childConfigurationsAndToolchains,
+      Map<BuildConfigurationValue, CcToolchainProvider> childConfigurationsAndToolchains,
       ImmutableListMultimap<String, TransitiveInfoCollection> cpuToDepsCollectionMap,
       ImmutableList<TransitiveInfoCollection> dylibProviders)
       throws RuleErrorException, InterruptedException {
     Iterable<ObjcProvider> dylibObjcProviders = getDylibObjcProviders(dylibProviders);
     ImmutableSet.Builder<DependencySpecificConfiguration> childInfoBuilder = ImmutableSet.builder();
 
-    for (BuildConfiguration childToolchainConfig : childConfigurationsAndToolchains.keySet()) {
+    for (BuildConfigurationValue childToolchainConfig : childConfigurationsAndToolchains.keySet()) {
       String childCpu = childToolchainConfig.getCpu();
 
       IntermediateArtifacts intermediateArtifacts =
@@ -247,7 +249,7 @@
 
   private ObjcCommon common(
       RuleContext ruleContext,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       IntermediateArtifacts intermediateArtifacts,
       List<? extends TransitiveInfoCollection> propagatedDeps,
       Iterable<ObjcProvider> additionalDepProviders)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index a1a4214..ac3c044 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -41,7 +41,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
@@ -98,7 +98,7 @@
     private final Purpose purpose;
     private final RuleContext context;
     private final StarlarkSemantics semantics;
-    private final BuildConfiguration buildConfiguration;
+    private final BuildConfigurationValue buildConfiguration;
     private Optional<CompilationAttributes> compilationAttributes = Optional.absent();
     private Optional<CompilationArtifacts> compilationArtifacts = Optional.absent();
     private Iterable<ObjcProvider> objcProviders = ImmutableList.of();
@@ -129,7 +129,7 @@
      * configuration data from the given configuration object for use in situations where a single
      * target's outputs are under multiple configurations.
      */
-    Builder(Purpose purpose, RuleContext context, BuildConfiguration buildConfiguration)
+    Builder(Purpose purpose, RuleContext context, BuildConfigurationValue buildConfiguration)
         throws InterruptedException {
       this.purpose = purpose;
       this.context = Preconditions.checkNotNull(context);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index d7f370b..9bb5c82 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
@@ -67,12 +67,12 @@
   }
 
   /**
-   * Creates and returns an {@link IntermediateArtifacts} object, using the given rule context
-   * for fetching current-rule attributes, and using the given build configuration to determine
-   * the appropriate output directory in which to root artifacts.
+   * Creates and returns an {@link IntermediateArtifacts} object, using the given rule context for
+   * fetching current-rule attributes, and using the given build configuration to determine the
+   * appropriate output directory in which to root artifacts.
    */
-  public static IntermediateArtifacts intermediateArtifacts(RuleContext ruleContext,
-      BuildConfiguration buildConfiguration) {
+  public static IntermediateArtifacts intermediateArtifacts(
+      RuleContext ruleContext, BuildConfigurationValue buildConfiguration) {
     return new IntermediateArtifacts(ruleContext, /*archiveFileNameSuffix*/ "",
         /*outputPrefix*/ "", buildConfiguration);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java
index e4007ce..e1b02dd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java
@@ -24,7 +24,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.VariablesExtension;
@@ -68,7 +68,7 @@
   private final ObjcProvider objcProvider;
   private final Artifact fullyLinkArchive;
   private final IntermediateArtifacts intermediateArtifacts;
-  private final BuildConfiguration buildConfiguration;
+  private final BuildConfigurationValue buildConfiguration;
   private final ImmutableList<String> frameworkSearchPaths;
   private final Set<String> frameworkNames;
   private final ImmutableList<String> libraryNames;
@@ -85,7 +85,7 @@
       ObjcProvider objcProvider,
       Artifact fullyLinkArchive,
       IntermediateArtifacts intermediateArtifacts,
-      BuildConfiguration buildConfiguration,
+      BuildConfigurationValue buildConfiguration,
       ImmutableList<String> frameworkSearchPaths,
       Set<String> frameworkNames,
       ImmutableList<String> libraryNames,
@@ -246,7 +246,7 @@
     private ObjcProvider objcProvider;
     private Artifact fullyLinkArchive;
     private IntermediateArtifacts intermediateArtifacts;
-    private BuildConfiguration buildConfiguration;
+    private BuildConfigurationValue buildConfiguration;
     private ImmutableList<String> frameworkSearchPaths;
     private Set<String> frameworkNames;
     private ImmutableSet<Artifact> forceLoadArtifacts;
@@ -285,7 +285,7 @@
     }
 
     /** Sets the configuration for this extension. */
-    public Builder setConfiguration(BuildConfiguration buildConfiguration) {
+    public Builder setConfiguration(BuildConfigurationValue buildConfiguration) {
       this.buildConfiguration = Preconditions.checkNotNull(buildConfiguration);
       return this;
     }
@@ -356,7 +356,7 @@
           activeVariableCategoriesBuilder.build();
 
       Preconditions.checkNotNull(ruleContext, "missing RuleContext");
-      Preconditions.checkNotNull(buildConfiguration, "missing BuildConfiguration");
+      Preconditions.checkNotNull(buildConfiguration, "missing BuildConfigurationValue");
       Preconditions.checkNotNull(intermediateArtifacts, "missing IntermediateArtifacts");
       if (activeVariableCategories.contains(VariableCategory.FULLY_LINK_VARIABLES)) {
         Preconditions.checkNotNull(objcProvider, "missing ObjcProvider");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyRuleClasses.java
index 0a848f7..82b5723 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyRuleClasses.java
@@ -18,7 +18,7 @@
 import com.google.common.base.Ascii;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptionsView;
 import com.google.devtools.build.lib.analysis.config.SymlinkDefinition;
@@ -124,8 +124,8 @@
     @Override
     public ImmutableSet<Path> getLinkPaths(
         BuildRequestOptions buildRequestOptions,
-        Set<BuildConfiguration> targetConfigs,
-        Function<BuildOptions, BuildConfiguration> configGetter,
+        Set<BuildConfigurationValue> targetConfigs,
+        Function<BuildOptions, BuildConfigurationValue> configGetter,
         RepositoryName repositoryName,
         Path outputPath,
         Path execRoot) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java
index 5866e1d..ff719ca 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandLogModule.java
@@ -17,7 +17,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.flogger.GoogleLogger;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.io.OutErr;
@@ -112,7 +112,8 @@
     }
 
     @Override
-    public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
+    public byte[] get(
+        Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env)
         throws AbruptExitException {
       checkNotNull(env);
       return print(getCommandLogPath(env.getRuntime().getWorkspace().getOutputBase()));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/InfoItem.java
index dddc2a0..1de9ea0 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/InfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStreamWriter;
@@ -60,7 +60,7 @@
 
   /** Returns the value of the info key. The return value is directly printed to stdout. */
   public abstract byte[] get(
-      Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env)
       throws AbruptExitException, InterruptedException;
 
   protected static byte[] print(Object value) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestResultAggregator.java b/src/main/java/com/google/devtools/build/lib/runtime/TestResultAggregator.java
index d8c4208..497479d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestResultAggregator.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestResultAggregator.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.analysis.AliasProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.TestAttempt;
 import com.google.devtools.build.lib.analysis.test.TestProvider;
 import com.google.devtools.build.lib.analysis.test.TestProvider.TestParams;
@@ -60,7 +60,7 @@
 
   TestResultAggregator(
       ConfiguredTarget target,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       AggregationPolicy policy,
       boolean skippedThisTest) {
     this.policy = policy;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java b/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
index 000ffdf..6237955 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
@@ -22,7 +22,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.AliasProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.test.TestProvider;
 import com.google.devtools.build.lib.analysis.test.TestProvider.TestParams;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType;
@@ -122,7 +122,7 @@
       checkMutation();
     }
 
-    public Builder setConfiguration(BuildConfiguration configuration) {
+    public Builder setConfiguration(BuildConfigurationValue configuration) {
       checkMutation(configuration);
       summary.configuration = checkNotNull(configuration, summary);
       return this;
@@ -365,7 +365,7 @@
   // Currently only populated if --runs_per_test_detects_flakes is enabled.
   private final ImmutableList<ArrayList<BlazeTestStatus>> shardRunStatuses;
 
-  private BuildConfiguration configuration;
+  private BuildConfigurationValue configuration;
   private BlazeTestStatus status;
   private boolean skipped;
   private final int[] shardAttempts;
@@ -416,7 +416,7 @@
     return target;
   }
 
-  public BuildConfiguration getConfiguration() {
+  public BuildConfigurationValue getConfiguration() {
     return configuration;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/BUILD b/src/main/java/com/google/devtools/build/lib/runtime/commands/BUILD
index dd2f4c8..0eda387 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/BUILD
@@ -69,7 +69,7 @@
         "//src/main/java/com/google/devtools/build/lib/runtime/commands/info",
         "//src/main/java/com/google/devtools/build/lib/shell",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_key_creator",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
         "//src/main/java/com/google/devtools/build/lib/skyframe:loading_phase_started_event",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_progress_receiver",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java
index 38f7361..d95a856 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java
@@ -32,7 +32,7 @@
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Table;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
@@ -51,7 +51,7 @@
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.ConfigCommand.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationKey;
 import com.google.devtools.build.lib.skyframe.SkyFunctions;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.skyframe.InMemoryMemoizingEvaluator;
@@ -119,7 +119,8 @@
   }
 
   /**
-   * Data structure defining a {@link BuildConfiguration} for the purpose of this command's output.
+   * Data structure defining a {@link BuildConfigurationValue} for the purpose of this command's
+   * output.
    *
    * <p>Includes all data representing a "configuration" and defines their relative structure and
    * list order.
@@ -258,8 +259,8 @@
   }
 
   /**
-   * Data structure defining the difference between two {@link BuildConfiguration}s from the point
-   * of this command's output.
+   * Data structure defining the difference between two {@link BuildConfigurationValue}s from the
+   * point of this command's output.
    *
    * <p>See {@link ConfigurationForOutput} for further details.
    */
@@ -293,7 +294,7 @@
   }
 
   /**
-   * Data structure defining the difference between two {@link BuildConfiguration}s for a given
+   * Data structure defining the difference between two {@link BuildConfigurationValue}s for a given
    * {@link FragmentOptions}from the point of this command's output.
    *
    * <p>See {@link ConfigurationForOutput} for further details.
@@ -330,7 +331,7 @@
    */
   @Override
   public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
-    ImmutableSortedMap<BuildConfigurationValue.Key, BuildConfiguration> configurations =
+    ImmutableSortedMap<BuildConfigurationKey, BuildConfigurationValue> configurations =
         findConfigurations(env);
 
     try (PrintWriter writer =
@@ -375,10 +376,10 @@
   }
 
   /**
-   * Returns all {@link BuildConfiguration}s in Skyframe as a map from their {@link
-   * BuildConfigurationValue.Key} to instance.
+   * Returns all {@link BuildConfigurationValue}s in Skyframe as a map from their {@link
+   * BuildConfigurationKey} to instance.
    */
-  private static ImmutableSortedMap<BuildConfigurationValue.Key, BuildConfiguration>
+  private static ImmutableSortedMap<BuildConfigurationKey, BuildConfigurationValue>
       findConfigurations(CommandEnvironment env) {
     InMemoryMemoizingEvaluator evaluator =
         (InMemoryMemoizingEvaluator)
@@ -387,9 +388,9 @@
         .filter(e -> SkyFunctions.BUILD_CONFIGURATION.equals(e.getKey().functionName()))
         .collect(
             toImmutableSortedMap(
-                comparing(BuildConfigurationValue.Key::toComparableString),
-                e -> (BuildConfigurationValue.Key) e.getKey(),
-                e -> ((BuildConfigurationValue) e.getValue()).getConfiguration()));
+                comparing(BuildConfigurationKey::toComparableString),
+                e -> (BuildConfigurationKey) e.getKey(),
+                e -> (BuildConfigurationValue) e.getValue()));
   }
 
   /**
@@ -397,8 +398,8 @@
    * runtime.
    *
    * <p>These are the fragments that Blaze "knows about", not necessarily the fragments in a {@link
-   * BuildConfiguration}. Trimming, in particular, strips fragments out of actual configurations.
-   * It's safe to assume untrimmed configuration have all fragments listed here.
+   * BuildConfigurationValue}. Trimming, in particular, strips fragments out of actual
+   * configurations. It's safe to assume untrimmed configuration have all fragments listed here.
    */
   private static ImmutableSortedMap<
           Class<? extends Fragment>, ImmutableSortedSet<Class<? extends FragmentOptions>>>
@@ -418,16 +419,15 @@
    * instances.
    */
   private static ImmutableSortedSet<ConfigurationForOutput> forOutput(
-      ImmutableSortedMap<BuildConfigurationValue.Key, BuildConfiguration> asSkyKeyMap,
+      ImmutableSortedMap<BuildConfigurationKey, BuildConfigurationValue> asSkyKeyMap,
       ImmutableSortedMap<
               Class<? extends Fragment>, ImmutableSortedSet<Class<? extends FragmentOptions>>>
           fragmentDefs) {
     ImmutableSortedSet.Builder<ConfigurationForOutput> ans =
         ImmutableSortedSet.orderedBy(comparing(e -> e.configHash));
-    for (Map.Entry<BuildConfigurationValue.Key, BuildConfiguration> entry :
-        asSkyKeyMap.entrySet()) {
-      BuildConfigurationValue.Key key = entry.getKey();
-      BuildConfiguration config = entry.getValue();
+    for (Map.Entry<BuildConfigurationKey, BuildConfigurationValue> entry : asSkyKeyMap.entrySet()) {
+      BuildConfigurationKey key = entry.getKey();
+      BuildConfigurationValue config = entry.getValue();
       ans.add(getConfigurationForOutput(key, config.checksum(), config, fragmentDefs));
     }
     return ans.build();
@@ -435,9 +435,9 @@
 
   /** Constructs a {@link ConfigurationForOutput} from the given input daata. */
   private static ConfigurationForOutput getConfigurationForOutput(
-      BuildConfigurationValue.Key skyKey,
+      BuildConfigurationKey skyKey,
       String configHash,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       ImmutableSortedMap<
               Class<? extends Fragment>, ImmutableSortedSet<Class<? extends FragmentOptions>>>
           fragmentDefs) {
@@ -547,7 +547,7 @@
    * output from interpreting them more deeply than we want for simple "name=value" output.
    */
   private static ImmutableSortedMap<String, String> getOrderedUserDefinedOptions(
-      BuildConfiguration config) {
+      BuildConfigurationValue config) {
     ImmutableSortedMap.Builder<String, String> ans = ImmutableSortedMap.naturalOrder();
 
     // Starlark-defined options:
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommandOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommandOutputFormatter.java
index 66cde87..69c635f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommandOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommandOutputFormatter.java
@@ -73,7 +73,7 @@
 
     @Override
     public void writeConfiguration(ConfigurationForOutput configuration) {
-      writer.println("BuildConfiguration " + configuration.configHash + ":");
+      writer.println("BuildConfigurationValue " + configuration.configHash + ":");
       writer.println("Skyframe Key: " + configuration.skyKey);
 
       StringBuilder fragments = new StringBuilder();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
index f6fe391..4694d92 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
@@ -71,8 +71,8 @@
  * set of inputs of test actions if coverage mode is enabled (otherwise the set of metadata files is
  * empty).
  *
- * <p>Whether or not coverage is being collected is stored in the {@code BuildConfiguration}. This
- * is handy because then we have an easy way to change the test action and the action graph
+ * <p>Whether or not coverage is being collected is stored in the {@code BuildConfigurationValue}.
+ * This is handy because then we have an easy way to change the test action and the action graph
  * depending on this bit, but it also means that if this bit is flipped, all targets need to be
  * re-analyzed (note that some languages, e.g. C++ require different compiler options to emit code
  * that can collect coverage, which dominates the time required for analysis).
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index 281933e..ea56a7f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -19,7 +19,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.NoBuildEvent;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.profiler.Profiler;
@@ -37,7 +37,7 @@
 import com.google.devtools.build.lib.runtime.commands.info.BuildLanguageInfoItem;
 import com.google.devtools.build.lib.runtime.commands.info.CharacterEncodingInfoItem;
 import com.google.devtools.build.lib.runtime.commands.info.ClientEnv;
-import com.google.devtools.build.lib.runtime.commands.info.CommitedHeapSizeInfoItem;
+import com.google.devtools.build.lib.runtime.commands.info.CommittedHeapSizeInfoItem;
 import com.google.devtools.build.lib.runtime.commands.info.DefaultPackagePathInfoItem;
 import com.google.devtools.build.lib.runtime.commands.info.DefaultsPackageInfoItem;
 import com.google.devtools.build.lib.runtime.commands.info.ExecutionRootInfoItem;
@@ -148,13 +148,15 @@
     env.getReporter().switchToAnsiAllowingHandler();
     Options infoOptions = optionsParsingResult.getOptions(Options.class);
     OutErr outErr = env.getReporter().getOutErr();
-    // Creating a BuildConfiguration is expensive and often unnecessary. Delay the creation until
+    // Creating a BuildConfigurationValue is expensive and often unnecessary. Delay the creation
+    // until
     // it is needed. We memoize so that it's cached intra-command (it's still created freshly on
     // every command since the configuration can change across commands).
-    Supplier<BuildConfiguration> configurationSupplier =
+    Supplier<BuildConfigurationValue> configurationSupplier =
         Suppliers.memoize(
             () -> {
-              try (SilentCloseable c = Profiler.instance().profile("Creating BuildConfiguration")) {
+              try (SilentCloseable c =
+                  Profiler.instance().profile("Creating BuildConfigurationValue")) {
                 // In order to be able to answer configuration-specific queries, we need to set up
                 // the package path. Since info inherits all the build options, all the necessary
                 // information is available here.
@@ -291,7 +293,7 @@
             new PackagePathInfoItem(commandOptions),
             new UsedHeapSizeInfoItem(),
             new UsedHeapSizeAfterGcInfoItem(),
-            new CommitedHeapSizeInfoItem(),
+            new CommittedHeapSizeInfoItem(),
             new MaxHeapSizeInfoItem(),
             new GcTimeInfoItem(),
             new GcCountInfoItem(),
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
index ef5d1bb..a38cb9c 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.analysis.FilesToRunProvider;
 import com.google.devtools.build.lib.analysis.RunfilesSupport;
 import com.google.devtools.build.lib.analysis.ShToolchain;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.RunUnder;
 import com.google.devtools.build.lib.analysis.test.TestConfiguration;
@@ -194,7 +194,7 @@
       List<String> cmdLine,
       List<String> prettyCmdLine,
       CommandEnvironment env,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       ConfiguredTarget targetToRun,
       ConfiguredTarget runUnderTarget,
       List<String> args)
@@ -353,7 +353,7 @@
       return reportAndCreateFailureResult(env, NO_TARGET_MESSAGE, Code.NO_TARGET_SPECIFIED);
     }
 
-    BuildConfiguration configuration =
+    BuildConfigurationValue configuration =
         env.getSkyframeExecutor()
             .getConfiguration(env.getReporter(), targetToRun.getConfigurationKey());
     if (configuration == null) {
@@ -606,7 +606,9 @@
    * otherwise builds them.
    */
   private static Path ensureRunfilesBuilt(
-      CommandEnvironment env, RunfilesSupport runfilesSupport, BuildConfiguration configuration)
+      CommandEnvironment env,
+      RunfilesSupport runfilesSupport,
+      BuildConfigurationValue configuration)
       throws RunfilesException, InterruptedException {
     Artifact manifest = Preconditions.checkNotNull(runfilesSupport.getRunfilesManifest());
     PathFragment runfilesDir = runfilesSupport.getRunfilesDirectoryExecPath();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeBinInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeBinInfoItem.java
index b5a7a3b..92ba7ce 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeBinInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeBinInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
@@ -32,7 +32,8 @@
   // corresponding paths contain the short name. Maybe we should recommend using the symlinks
   // or make them hidden by default?
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(configurationSupplier);
     return print(configurationSupplier.get().getBinDirectory(RepositoryName.MAIN).getRoot());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeGenfilesInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeGenfilesInfoItem.java
index b2c2f84..d317a61 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeGenfilesInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeGenfilesInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
@@ -33,7 +33,8 @@
   // corresponding paths contain the short name. Maybe we should recommend using the symlinks
   // or make them hidden by default?
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(configurationSupplier);
     return print(configurationSupplier.get().getGenfilesDirectory(RepositoryName.MAIN).getRoot());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeTestlogsInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeTestlogsInfoItem.java
index 863c4b1..012141d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeTestlogsInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BlazeTestlogsInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
@@ -35,7 +35,8 @@
   // corresponding paths contain the short name. Maybe we should recommend using the symlinks
   // or make them hidden by default?
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(configurationSupplier);
     return print(configurationSupplier.get().getTestLogsDirectory(RepositoryName.MAIN).getRoot());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BuildLanguageInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BuildLanguageInfoItem.java
index 8d3560e..4d5517f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BuildLanguageInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BuildLanguageInfoItem.java
@@ -21,7 +21,7 @@
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.StarlarkComputedDefaultTemplate;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -55,7 +55,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print(getBuildLanguageDefinition(env.getRuntime().getRuleClassProvider()));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CharacterEncodingInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CharacterEncodingInfoItem.java
index 8d7f3b5..c6a6ba7 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CharacterEncodingInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CharacterEncodingInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import java.nio.charset.Charset;
@@ -30,7 +30,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(
         String.format(
             "file.encoding = %s, defaultCharset = %s",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ClientEnv.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ClientEnv.java
index 2a0534d..65e07cd 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ClientEnv.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ClientEnv.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import java.util.Map;
@@ -31,7 +31,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     String result = "";
     for (Map.Entry<String, String> entry : env.getAllowlistedActionEnv().entrySet()) {
       // TODO(bazel-team): as the syntax of our rc-files does not support to express new-lines in
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CommitedHeapSizeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CommittedHeapSizeInfoItem.java
similarity index 84%
rename from src/main/java/com/google/devtools/build/lib/runtime/commands/info/CommitedHeapSizeInfoItem.java
rename to src/main/java/com/google/devtools/build/lib/runtime/commands/info/CommittedHeapSizeInfoItem.java
index 010a9a1..ac95a73 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CommitedHeapSizeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/CommittedHeapSizeInfoItem.java
@@ -15,14 +15,15 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.util.StringUtilities;
 
 /** Info item for the committed heap size. */
-public final class CommitedHeapSizeInfoItem extends InfoItem {
-  public CommitedHeapSizeInfoItem() {
+public final class CommittedHeapSizeInfoItem extends InfoItem {
+
+  public CommittedHeapSizeInfoItem() {
     super(
         "committed-heap-size",
         "The amount of memory in bytes that is committed for the Java virtual machine to use",
@@ -30,7 +31,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(StringUtilities.prettyPrintBytes(InfoItemUtils.getMemoryUsage().getCommitted()));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultPackagePathInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultPackagePathInfoItem.java
index 93d6c45..23b282e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultPackagePathInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultPackagePathInfoItem.java
@@ -18,7 +18,7 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
@@ -41,7 +41,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(commandOptions);
     return print(JOINER.join(commandOptions.getOptions(PackageOptions.class).packagePath));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultsPackageInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultsPackageInfoItem.java
index 8b46854..b438bd8 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultsPackageInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/DefaultsPackageInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -34,7 +34,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print("");
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ExecutionRootInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ExecutionRootInfoItem.java
index efd5481..2d34190 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ExecutionRootInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ExecutionRootInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -31,7 +31,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print(
         env.getDirectories().getExecRoot(configurationSupplier.get().getMainRepositoryName()));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcCountInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcCountInfoItem.java
index 5e94fe4..866db3b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcCountInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcCountInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import java.lang.management.GarbageCollectorMXBean;
@@ -28,7 +28,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     // The documentation is not very clear on what it means to have more than
     // one GC MXBean, so we just sum them up.
     long gcCount = 0;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcTimeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcTimeInfoItem.java
index 6f9ec10..55ffb28 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcTimeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/GcTimeInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import java.lang.management.GarbageCollectorMXBean;
@@ -28,7 +28,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     // The documentation is not very clear on what it means to have more than
     // one GC MXBean, so we just sum them up.
     long gcTime = 0;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/InstallBaseInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/InstallBaseInfoItem.java
index 302ec4f..3b11351 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/InstallBaseInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/InstallBaseInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -28,7 +28,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print(env.getRuntime().getWorkspace().getInstallBase());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaHomeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaHomeInfoItem.java
index e0c3d0d..7a147b7 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaHomeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaHomeInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.vfs.Path;
@@ -27,7 +27,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     String javaHome = System.getProperty("java.home");
     if (javaHome == null) {
       return print("unknown");
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaRuntimeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaRuntimeInfoItem.java
index 98419d1..cb4c728 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaRuntimeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaRuntimeInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -26,7 +26,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(
         String.format(
             "%s (build %s) by %s",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaVirtualMachineInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaVirtualMachineInfoItem.java
index bc22927..4a43737 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaVirtualMachineInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/JavaVirtualMachineInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -26,7 +26,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(
         String.format(
             "%s (build %s, %s) by %s",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MakeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MakeInfoItem.java
index 48bf4ed..dde7ced 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MakeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MakeInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -31,7 +31,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(description);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MaxHeapSizeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MaxHeapSizeInfoItem.java
index 5ea468e..0dd8e4f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MaxHeapSizeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/MaxHeapSizeInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.util.StringUtilities;
@@ -30,7 +30,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(StringUtilities.prettyPrintBytes(InfoItemUtils.getMemoryUsage().getMax()));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputBaseInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputBaseInfoItem.java
index 584e9e7..8c946c1 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputBaseInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputBaseInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -33,7 +33,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print(env.getRuntime().getWorkspace().getOutputBase());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputPathInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputPathInfoItem.java
index 8135a3f..d3577ba 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputPathInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/OutputPathInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -28,7 +28,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print(
         env.getDirectories().getOutputPath(configurationSupplier.get().getMainRepositoryName()));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/PackagePathInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/PackagePathInfoItem.java
index 29a4e71..f2a49b1 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/PackagePathInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/PackagePathInfoItem.java
@@ -18,7 +18,7 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
@@ -34,7 +34,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(commandOptions);
     PackageOptions packageOptions = commandOptions.getOptions(PackageOptions.class);
     return print(Joiner.on(":").join(packageOptions.packagePath));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ReleaseInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ReleaseInfoItem.java
index fc4f036..b182f92 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ReleaseInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ReleaseInfoItem.java
@@ -16,7 +16,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -27,7 +27,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(BlazeVersionInfo.instance().getReleaseName());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerLogInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerLogInfoItem.java
index 0c98649..5e31d90 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerLogInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerLogInfoItem.java
@@ -16,7 +16,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.flogger.GoogleLogger;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.util.AbruptExitException;
@@ -37,7 +37,7 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
+  public byte[] get(Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env)
       throws AbruptExitException {
     try {
       return print(DebugLoggerConfigurator.getServerLogPath().orElse(""));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerPidInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerPidInfoItem.java
index ac8e904..aa4207e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerPidInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/ServerPidInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.util.ProcessUtils;
@@ -27,7 +27,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(ProcessUtils.getpid());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java
index b0f39c9..65de0c6 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
@@ -40,7 +40,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     BuildLanguageOptions buildLanguageOptions =
         commandOptions.getOptions(BuildLanguageOptions.class);
     SkyframeExecutor skyframeExecutor = env.getBlazeWorkspace().getSkyframeExecutor();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeAfterGcInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeAfterGcInfoItem.java
index 55ca121..84d8cbd 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeAfterGcInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeAfterGcInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.util.StringUtilities;
@@ -30,7 +30,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     System.gc();
     return print(StringUtilities.prettyPrintBytes(InfoItemUtils.getMemoryUsage().getUsed()));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeInfoItem.java
index 33e7669..eabcf1c 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/UsedHeapSizeInfoItem.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime.commands.info;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.util.StringUtilities;
@@ -32,7 +32,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     return print(StringUtilities.prettyPrintBytes(InfoItemUtils.getMemoryUsage().getUsed()));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/WorkspaceInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/WorkspaceInfoItem.java
index 9a0ba84..2fcf566 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/WorkspaceInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/WorkspaceInfoItem.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Supplier;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 
@@ -28,7 +28,8 @@
   }
 
   @Override
-  public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env) {
+  public byte[] get(
+      Supplier<BuildConfigurationValue> configurationSupplier, CommandEnvironment env) {
     checkNotNull(env);
     return print(env.getRuntime().getWorkspace().getWorkspace());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
index 0f25857..21e90c0 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.configuredtargets.AbstractConfiguredTarget;
 import com.google.devtools.build.lib.analysis.test.TestConfiguration.TestOptions;
 import com.google.devtools.build.lib.buildtool.BuildRequest;
@@ -272,7 +272,7 @@
 
     List<String> cmdLine = new ArrayList<>();
     // TODO(bazel-team): Get the executable path from the filesToRun provider from the aspect.
-    BuildConfiguration configuration =
+    BuildConfigurationValue configuration =
         env.getSkyframeExecutor()
             .getConfiguration(env.getReporter(), targetToRun.getConfigurationKey());
     cmdLine.add(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java
index e189f45..4f13033 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletor.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.analysis.AspectValue;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsToBuild;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.bugreport.BugReporter;
 import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId;
@@ -92,8 +93,8 @@
   }
 
   @Nullable
-  private BuildEventId getConfigurationEventIdFromAspectKey(AspectKey aspectKey, Environment env)
-      throws InterruptedException {
+  private static BuildEventId getConfigurationEventIdFromAspectKey(
+      AspectKey aspectKey, Environment env) throws InterruptedException {
     if (aspectKey.getBaseConfiguredTargetKey().getConfigurationKey() == null) {
       return BuildEventIdUtil.nullConfigurationId();
     } else {
@@ -103,7 +104,7 @@
       if (buildConfigurationValue == null) {
         return null;
       }
-      return buildConfigurationValue.getConfiguration().getEventId();
+      return buildConfigurationValue.getEventId();
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCreationException.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCreationException.java
index 89897d6..e70a0e1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCreationException.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCreationException.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.ConfigurationId;
 import com.google.devtools.build.lib.causes.AnalysisFailedCause;
 import com.google.devtools.build.lib.causes.Cause;
@@ -29,7 +29,7 @@
 
 /** An exception indicating that there was a problem creating an aspect. */
 public final class AspectCreationException extends Exception implements SaneAnalysisException {
-  private static ConfigurationId toId(BuildConfiguration config) {
+  private static ConfigurationId toId(BuildConfigurationValue config) {
     return config == null ? null : config.getEventId().getConfiguration();
   }
 
@@ -48,7 +48,7 @@
   public AspectCreationException(
       String message,
       Label currentTarget,
-      @Nullable BuildConfiguration configuration,
+      @Nullable BuildConfigurationValue configuration,
       DetailedExitCode detailedExitCode) {
     this(
         message,
@@ -59,7 +59,7 @@
   }
 
   public AspectCreationException(
-      String message, Label currentTarget, @Nullable BuildConfiguration configuration) {
+      String message, Label currentTarget, @Nullable BuildConfigurationValue configuration) {
     this(
         message,
         currentTarget,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index 2633d47..a8f56d5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -41,7 +41,7 @@
 import com.google.devtools.build.lib.analysis.ResolvedToolchainContext;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainCollection;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigConditions;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
 import com.google.devtools.build.lib.analysis.config.DependencyEvaluationException;
@@ -235,7 +235,7 @@
     }
 
     ConfiguredTargetValue baseConfiguredTargetValue;
-    BuildConfiguration aspectConfiguration = null;
+    BuildConfigurationValue aspectConfiguration = null;
 
     try {
       baseConfiguredTargetValue =
@@ -248,9 +248,8 @@
     if (aspectHasConfiguration) {
       try {
         aspectConfiguration =
-            ((BuildConfigurationValue)
-                    baseAndAspectValues.get(key.getAspectConfigurationKey()).get())
-                .getConfiguration();
+            (BuildConfigurationValue)
+                baseAndAspectValues.get(key.getAspectConfigurationKey()).get();
       } catch (ConfiguredValueCreationException e) {
         throw new IllegalStateException("Unexpected exception from BuildConfigurationFunction when "
             + "computing " + key.getAspectConfigurationKey(), e);
@@ -260,7 +259,7 @@
     ConfiguredTarget associatedTarget = baseConfiguredTargetValue.getConfiguredTarget();
 
     Package targetPkg;
-    BuildConfiguration configuration = null;
+    BuildConfigurationValue configuration = null;
     PackageValue.Key packageKey =
         PackageValue.key(associatedTarget.getOriginalLabel().getPackageIdentifier());
     if (associatedTarget.getConfigurationKey() == null) {
@@ -280,9 +279,7 @@
         return null;
       }
       targetPkg = ((PackageValue) result.get(packageKey)).getPackage();
-      configuration =
-          ((BuildConfigurationValue) result.get(associatedTarget.getConfigurationKey()))
-              .getConfiguration();
+      configuration = (BuildConfigurationValue) result.get(associatedTarget.getConfigurationKey());
     }
 
     Target target;
@@ -518,7 +515,10 @@
 
   @Nullable
   private static UnloadedToolchainContext getUnloadedToolchainContext(
-      Environment env, AspectKey key, Aspect aspect, @Nullable BuildConfiguration configuration)
+      Environment env,
+      AspectKey key,
+      Aspect aspect,
+      @Nullable BuildConfigurationValue configuration)
       throws InterruptedException, AspectCreationException {
     // Determine what toolchains are needed by this target.
     UnloadedToolchainContext unloadedToolchainContext = null;
@@ -531,7 +531,7 @@
             (UnloadedToolchainContext)
                 env.getValueOrThrow(
                     ToolchainContextKey.key()
-                        .configurationKey(BuildConfigurationValue.key(configuration))
+                        .configurationKey(configuration.getKey())
                         .requiredToolchainTypeLabels(requiredToolchains)
                         .build(),
                     ToolchainException.class);
@@ -553,7 +553,7 @@
    */
   // TODO(#10523): Remove this when the migration period for toolchain transitions has ended.
   private static boolean shouldUseToolchainTransition(
-      @Nullable BuildConfiguration configuration, AspectDefinition definition) {
+      @Nullable BuildConfigurationValue configuration, AspectDefinition definition) {
     // Check whether the global incompatible change flag is set.
     if (configuration != null) {
       PlatformOptions platformOptions = configuration.getOptions().get(PlatformOptions.class);
@@ -624,11 +624,11 @@
   @Nullable
   private AspectValue createAliasAspect(
       Environment env,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       TargetAndConfiguration originalTarget,
       Aspect aspect,
       AspectKey originalKey,
-      BuildConfiguration aspectConfiguration,
+      BuildConfigurationValue aspectConfiguration,
       ConfiguredTarget configuredTarget)
       throws AspectFunctionException, InterruptedException {
     ImmutableList<Label> aliasChain =
@@ -827,7 +827,7 @@
       Aspect aspect,
       ConfiguredAspectFactory aspectFactory,
       ConfiguredTargetAndData associatedTarget,
-      BuildConfiguration aspectConfiguration,
+      BuildConfigurationValue aspectConfiguration,
       ConfigConditions configConditions,
       ResolvedToolchainContext toolchainContext,
       OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> directDeps,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectKeyCreator.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectKeyCreator.java
index 10ba833..0d4c5ac 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectKeyCreator.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectKeyCreator.java
@@ -17,7 +17,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Interner;
 import com.google.devtools.build.lib.actions.ActionLookupKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.packages.AspectClass;
@@ -38,21 +38,21 @@
 
   public static AspectKey createAspectKey(
       Label label,
-      @Nullable BuildConfiguration baseConfiguration,
+      @Nullable BuildConfigurationValue baseConfiguration,
       ImmutableList<AspectKey> baseKeys,
       AspectDescriptor aspectDescriptor,
-      @Nullable BuildConfiguration aspectConfiguration) {
+      @Nullable BuildConfigurationValue aspectConfiguration) {
     return AspectKey.createAspectKey(
         ConfiguredTargetKey.builder().setLabel(label).setConfiguration(baseConfiguration).build(),
         baseKeys,
         aspectDescriptor,
-        aspectConfiguration == null ? null : BuildConfigurationValue.key(aspectConfiguration));
+        aspectConfiguration == null ? null : aspectConfiguration.getKey());
   }
 
   public static AspectKey createAspectKey(
       AspectDescriptor aspectDescriptor,
       ImmutableList<AspectKey> baseKeys,
-      BuildConfigurationValue.Key aspectConfigurationKey,
+      BuildConfigurationKey aspectConfigurationKey,
       ConfiguredTargetKey baseConfiguredTargetKey) {
     return AspectKey.createAspectKey(
         baseConfiguredTargetKey, baseKeys, aspectDescriptor, aspectConfigurationKey);
@@ -60,20 +60,20 @@
 
   public static AspectKey createAspectKey(
       Label label,
-      @Nullable BuildConfiguration baseConfiguration,
+      @Nullable BuildConfigurationValue baseConfiguration,
       AspectDescriptor aspectDescriptor,
-      @Nullable BuildConfiguration aspectConfiguration) {
+      @Nullable BuildConfigurationValue aspectConfiguration) {
     return AspectKey.createAspectKey(
         ConfiguredTargetKey.builder().setLabel(label).setConfiguration(baseConfiguration).build(),
         ImmutableList.of(),
         aspectDescriptor,
-        aspectConfiguration == null ? null : BuildConfigurationValue.key(aspectConfiguration));
+        aspectConfiguration == null ? null : aspectConfiguration.getKey());
   }
 
   public static TopLevelAspectsKey createTopLevelAspectsKey(
       ImmutableList<AspectClass> topLevelAspectsClasses,
       Label targetLabel,
-      @Nullable BuildConfiguration configuration) {
+      @Nullable BuildConfigurationValue configuration) {
     return TopLevelAspectsKey.createInternal(
         topLevelAspectsClasses,
         targetLabel,
@@ -110,14 +110,14 @@
   @AutoCodec
   public static final class AspectKey extends AspectBaseKey {
     private final ImmutableList<AspectKey> baseKeys;
-    @Nullable private final BuildConfigurationValue.Key aspectConfigurationKey;
+    @Nullable private final BuildConfigurationKey aspectConfigurationKey;
     private final AspectDescriptor aspectDescriptor;
 
     private AspectKey(
         ConfiguredTargetKey baseConfiguredTargetKey,
         ImmutableList<AspectKey> baseKeys,
         AspectDescriptor aspectDescriptor,
-        @Nullable BuildConfigurationValue.Key aspectConfigurationKey,
+        @Nullable BuildConfigurationKey aspectConfigurationKey,
         int hashCode) {
       super(baseConfiguredTargetKey, hashCode);
       this.baseKeys = baseKeys;
@@ -131,7 +131,7 @@
         ConfiguredTargetKey baseConfiguredTargetKey,
         ImmutableList<AspectKey> baseKeys,
         AspectDescriptor aspectDescriptor,
-        @Nullable BuildConfigurationValue.Key aspectConfigurationKey) {
+        @Nullable BuildConfigurationKey aspectConfigurationKey) {
       return aspectKeyInterner.intern(
           new AspectKey(
               baseConfiguredTargetKey,
@@ -207,7 +207,7 @@
      * base target's configuration.
      */
     @Nullable
-    public BuildConfigurationValue.Key getAspectConfigurationKey() {
+    public BuildConfigurationKey getAspectConfigurationKey() {
       return aspectConfigurationKey;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 78f260b..4f2693f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -109,7 +109,7 @@
         ":artifact_nested_set_key",
         ":aspect_creation_exception",
         ":aspect_key_creator",
-        ":build_configuration_value",
+        ":build_configuration",
         ":build_driver_key",
         ":build_driver_value",
         ":build_info_collection_value",
@@ -815,7 +815,7 @@
     name = "aspect_key_creator",
     srcs = ["AspectKeyCreator.java"],
     deps = [
-        ":build_configuration_value",
+        ":build_configuration",
         ":configured_target_key",
         ":sky_functions",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
@@ -900,14 +900,13 @@
 )
 
 java_library(
-    name = "build_configuration_value",
+    name = "build_configuration",
     srcs = [
-        "BuildConfigurationValue.java",
+        "BuildConfigurationKey.java",
         "PlatformMappingValue.java",
     ],
     deps = [
         ":sky_functions",
-        "//src/main/java/com/google/devtools/build/lib/analysis:config/build_configuration",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/build_options",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_class_set",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_options",
@@ -928,7 +927,7 @@
     name = "build_info_collection_value",
     srcs = ["BuildInfoCollectionValue.java"],
     deps = [
-        ":build_configuration_value",
+        ":build_configuration",
         ":sky_functions",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
@@ -1140,7 +1139,7 @@
     name = "configured_target_and_data",
     srcs = ["ConfiguredTargetAndData.java"],
     deps = [
-        ":build_configuration_value",
+        ":build_configuration",
         ":package_value",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/build_configuration",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
@@ -1156,7 +1155,7 @@
     name = "configured_target_key",
     srcs = ["ConfiguredTargetKey.java"],
     deps = [
-        ":build_configuration_value",
+        ":build_configuration",
         ":sky_functions",
         ":toolchain_context_key",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
@@ -2511,7 +2510,7 @@
     name = "toolchain_context_key",
     srcs = ["ToolchainContextKey.java"],
     deps = [
-        ":build_configuration_value",
+        ":build_configuration",
         ":sky_functions",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
index 005646f..821ca32 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.actions.ActionEnvironment;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.Fragment;
@@ -67,7 +67,7 @@
       return null;
     }
 
-    BuildConfigurationValue.Key key = (BuildConfigurationValue.Key) skyKey.argument();
+    BuildConfigurationKey key = (BuildConfigurationKey) skyKey.argument();
     ImmutableSortedMap<Class<? extends Fragment>, Fragment> fragments;
     try {
       fragments = getConfigurationFragments(key);
@@ -91,23 +91,21 @@
 
     try {
       return new BuildConfigurationValue(
-          new BuildConfiguration(
-              directories,
-              fragments,
-              fragmentClasses,
-              key.getOptions(),
-              ruleClassProvider.getReservedActionMnemonics(),
-              actionEnvironment,
-              RepositoryName.createFromValidStrippedName(workspaceNameValue.getName()),
-              starlarkSemantics.getBool(
-                  BuildLanguageOptions.EXPERIMENTAL_SIBLING_REPOSITORY_LAYOUT)));
+          directories,
+          fragments,
+          fragmentClasses,
+          key.getOptions(),
+          ruleClassProvider.getReservedActionMnemonics(),
+          actionEnvironment,
+          RepositoryName.createFromValidStrippedName(workspaceNameValue.getName()),
+          starlarkSemantics.getBool(BuildLanguageOptions.EXPERIMENTAL_SIBLING_REPOSITORY_LAYOUT));
     } catch (InvalidMnemonicException e) {
       throw new BuildConfigurationFunctionException(e);
     }
   }
 
   private ImmutableSortedMap<Class<? extends Fragment>, Fragment> getConfigurationFragments(
-      BuildConfigurationValue.Key key) throws InvalidConfigurationException {
+      BuildConfigurationKey key) throws InvalidConfigurationException {
     FragmentClassSet fragmentClasses = key.getFragments();
     ImmutableSortedMap.Builder<Class<? extends Fragment>, Fragment> fragments =
         ImmutableSortedMap.orderedBy(FragmentClassSet.LEXICAL_FRAGMENT_SORTER);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationKey.java
new file mode 100644
index 0000000..2a9b7ea
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationKey.java
@@ -0,0 +1,143 @@
+// Copyright 2021 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skyframe;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Interner;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.skyframe.SkyFunctionName;
+import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.common.options.OptionsParsingException;
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * {@link SkyKey} for {@link com.google.devtools.build.lib.analysis.config.BuildConfigurationValue}.
+ */
+@AutoCodec
+public final class BuildConfigurationKey implements SkyKey, Serializable {
+
+  /**
+   * Creates a new configuration key based on the given options, after applying a platform mapping
+   * transformation.
+   *
+   * @param platformMappingValue sky value that can transform a configuration key based on a
+   *     platform mapping
+   * @param fragments set of options fragments this configuration should cover
+   * @param options the desired configuration
+   * @throws OptionsParsingException if the platform mapping cannot be parsed
+   */
+  public static BuildConfigurationKey withPlatformMapping(
+      PlatformMappingValue platformMappingValue, FragmentClassSet fragments, BuildOptions options)
+      throws OptionsParsingException {
+    return platformMappingValue.map(withoutPlatformMapping(fragments, options));
+  }
+
+  /**
+   * Returns the key for a requested configuration.
+   *
+   * <p>Callers are responsible for applying the platform mapping or ascertaining that a platform
+   * mapping is not required.
+   *
+   * @param fragments the fragments the configuration should contain
+   * @param options the {@link BuildOptions} object the {@link BuildOptions} should be rebuilt from
+   */
+  @AutoCodec.Instantiator
+  public static BuildConfigurationKey withoutPlatformMapping(
+      FragmentClassSet fragments, BuildOptions options) {
+    return interner.intern(new BuildConfigurationKey(fragments, options));
+  }
+
+  private static final Interner<BuildConfigurationKey> interner = BlazeInterners.newWeakInterner();
+
+  private final FragmentClassSet fragments;
+  private final BuildOptions options;
+  private final int hashCode;
+
+  private BuildConfigurationKey(FragmentClassSet fragments, BuildOptions options) {
+    this.fragments = Preconditions.checkNotNull(fragments);
+    this.options = Preconditions.checkNotNull(options);
+    this.hashCode = Objects.hash(fragments, options);
+  }
+
+  public FragmentClassSet getFragments() {
+    return fragments;
+  }
+
+  public BuildOptions getOptions() {
+    return options;
+  }
+
+  @Override
+  public SkyFunctionName functionName() {
+    return SkyFunctions.BUILD_CONFIGURATION;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof BuildConfigurationKey)) {
+      return false;
+    }
+    BuildConfigurationKey otherConfig = (BuildConfigurationKey) o;
+    return options.equals(otherConfig.options) && fragments.equals(otherConfig.fragments);
+  }
+
+  @Override
+  public int hashCode() {
+    return hashCode;
+  }
+
+  @Override
+  public String toString() {
+    // This format is depended on by integration tests.
+    // TODO(blaze-configurability-team): This should at least include the length of fragments.
+    // to at least remind devs that this Key has TWO key parts.
+    return "BuildConfigurationKey[" + options.checksum() + "]";
+  }
+
+  /**
+   * Returns a string representation that can be safely used for comparison purposes.
+   *
+   * <p>Unlike toString, which is short and good for printing in debug contexts, this is long
+   * because it includes sufficient information in options and fragments. toString alone is
+   * insufficient because multiple Keys can have the same options checksum (and thus same toString)
+   * but different fragments.
+   *
+   * <p>This function is meant to address two potential, trimming-related scenarios: 1. If trimming
+   * by only trimming BuildOptions (e.g. --trim_test_configuration), then after the initial
+   * trimming, fragments has extra classes (corresponding to those trimmed). Notably, dependencies
+   * of trimmed targets will create Keys with a properly trimmed set of fragments. Thus, will easily
+   * have two Keys with the same (trimmed) BuildOptions but different fragments yet corresponding to
+   * the same (trimmed) BuildConfigurationValue.
+   *
+   * <p>2. If trimming by only trimming fragments (at time of this comment, unsure whether this is
+   * ever done in active code), then BuildOptions has extra classes. The returned
+   * BuildConfigurationValue is properly trimmed (with the extra classes BuildOptions removed)
+   * although notably with a different checksum compared to the Key checksum. Note that given a
+   * target that is doing trimming like this, the reverse dependency of the target (i.e. without
+   * trimming) could easily involve a Key with the same (untrimmed!) BuildOptions but different
+   * fragments. However, unlike in case 1, they will correspond to different
+   * BuildConfigurationValue.
+   */
+  public String toComparableString() {
+    return "BuildConfigurationKey[" + options.checksum() + ", " + fragments + "]";
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
deleted file mode 100644
index ef3588c..0000000
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.skyframe;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Interner;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
-import com.google.devtools.build.lib.concurrent.BlazeInterners;
-import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.skyframe.SkyFunctionName;
-import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
-import com.google.devtools.common.options.OptionsParsingException;
-import java.io.Serializable;
-import java.util.Objects;
-
-/** A Skyframe value representing a {@link BuildConfiguration}. */
-// TODO(bazel-team): mark this immutable when BuildConfiguration is immutable.
-// @Immutable
-@AutoCodec
-@ThreadSafe
-public class BuildConfigurationValue implements SkyValue {
-  private final BuildConfiguration configuration;
-
-  BuildConfigurationValue(BuildConfiguration configuration) {
-    this.configuration = configuration;
-  }
-
-  public BuildConfiguration getConfiguration() {
-    return configuration;
-  }
-
-  /**
-   * Creates a new configuration key based on the given options, after applying a platform mapping
-   * transformation.
-   *
-   * @param platformMappingValue sky value that can transform a configuration key based on a
-   *     platform mapping
-   * @param fragments set of options fragments this configuration should cover
-   * @param options the desired configuration
-   * @throws OptionsParsingException if the platform mapping cannot be parsed
-   */
-  public static Key keyWithPlatformMapping(
-      PlatformMappingValue platformMappingValue,
-      FragmentClassSet fragments,
-      BuildOptions options)
-      throws OptionsParsingException {
-    return platformMappingValue.map(keyWithoutPlatformMapping(fragments, options));
-  }
-
-  /**
-   * Returns the key for a requested configuration.
-   *
-   * <p>Callers are responsible for applying the platform mapping or ascertaining that a platform
-   * mapping is not required.
-   *
-   * @param fragments the fragments the configuration should contain
-   * @param options the {@link BuildOptions} object the {@link BuildOptions} should be rebuilt from
-   */
-  public static Key keyWithoutPlatformMapping(FragmentClassSet fragments, BuildOptions options) {
-    return Key.create(fragments, options);
-  }
-
-  /**
-   * Returns a configuration key for the given configuration.
-   *
-   * <p>Note that this key creation method does not apply a platform mapping, it is assumed that the
-   * passed configuration was created with one such and thus its key does not need to be mapped
-   * again.
-   *
-   * @param buildConfiguration configuration whose key is requested
-   */
-  public static Key key(BuildConfiguration buildConfiguration) {
-    return keyWithoutPlatformMapping(
-        buildConfiguration.fragmentClasses(), buildConfiguration.getOptions());
-  }
-
-  /** {@link SkyKey} for {@link BuildConfigurationValue}. */
-  @AutoCodec
-  public static final class Key implements SkyKey, Serializable {
-    private static final Interner<Key> keyInterner = BlazeInterners.newWeakInterner();
-
-    private final FragmentClassSet fragments;
-    private final BuildOptions options;
-    private final int hashCode;
-
-    @AutoCodec.Instantiator
-    @VisibleForSerialization
-    static Key create(FragmentClassSet fragments, BuildOptions options) {
-      return keyInterner.intern(new Key(fragments, options));
-    }
-
-    private Key(FragmentClassSet fragments, BuildOptions options) {
-      this.fragments = Preconditions.checkNotNull(fragments);
-      this.options = Preconditions.checkNotNull(options);
-      this.hashCode = Objects.hash(fragments, options);
-    }
-
-    public FragmentClassSet getFragments() {
-      return fragments;
-    }
-
-    public BuildOptions getOptions() {
-      return options;
-    }
-
-    @Override
-    public SkyFunctionName functionName() {
-      return SkyFunctions.BUILD_CONFIGURATION;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (this == o) {
-        return true;
-      }
-      if (!(o instanceof Key)) {
-        return false;
-      }
-      Key otherConfig = (Key) o;
-      return options.equals(otherConfig.options) && fragments.equals(otherConfig.fragments);
-    }
-
-    @Override
-    public int hashCode() {
-      return hashCode;
-    }
-
-    @Override
-    public String toString() {
-      // This format is depended on by integration tests.
-      // TODO(blaze-configurability-team): This should at least include the length of fragments.
-      // to at least remind devs that this Key has TWO key parts.
-      return "BuildConfigurationValue.Key[" + options.checksum() + "]";
-    }
-
-    /**
-     * Return a string representation that can be safely used for comparison purposes.
-     *
-     * <p>Unlike toString, which is short and good for printing in debug contexts, this is long
-     * because it includes sufficient information in options and fragments. toString alone is
-     * insufficient because multiple Keys can have the same options checksum (and thus same
-     * toString) but different fragments.
-     *
-     * <p>This function is meant to address two potential, trimming-related scenarios: 1. If
-     * trimming by only trimming BuildOptions (e.g. --trim_test_configuration), then after the
-     * initial trimming, fragments has extra classes (corresponding to those trimmed). Notably,
-     * dependencies of trimmed targets will create Keys with a properly trimmed set of fragments.
-     * Thus, will easily have two Keys with the same (trimmed) BuildOptions but different fragments
-     * yet corresponding to the same (trimmed) BuildConfigurationValue.
-     *
-     * <p>2. If trimming by only trimming fragments (at time of this comment, unsure whether this is
-     * ever done in active code), then BuildOptions has extra classes. The returned
-     * BuildConfigurationValue is properly trimmed (with the extra classes BuildOptions removed)
-     * although notably with a different checksum compared to the Key checksum. Note that given a
-     * target that is doing trimming like this, the reverse dependency of the target (i.e. without
-     * trimming) could easily involve a Key with the same (untrimmed!) BuildOptions but different
-     * fragments. However, unlike in case 1, they will correspond to different
-     * BuildConfigurationValue.
-     */
-    public String toComparableString() {
-      return "BuildConfigurationValue.Key[" + options.checksum() + ", " + fragments + "]";
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
index dda34ba..bf97a1f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoContext;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoType;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue.BuildInfoKeyAndConfig;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -65,8 +65,8 @@
     WorkspaceStatusValue infoArtifactValue =
         (WorkspaceStatusValue) result.get(WorkspaceStatusValue.BUILD_INFO_KEY);
 
-    BuildConfiguration config =
-        ((BuildConfigurationValue) result.get(keyAndConfig.getConfigKey())).getConfiguration();
+    BuildConfigurationValue config =
+        (BuildConfigurationValue) result.get(keyAndConfig.getConfigKey());
     Map<BuildInfoKey, BuildInfoFactory> buildInfoFactories = BUILD_INFO_FACTORIES.get(env);
     BuildInfoFactory buildInfoFactory = buildInfoFactories.get(keyAndConfig.getInfoKey());
     Preconditions.checkState(buildInfoFactory.isEnabled(config));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java
index 79588e2..76dc915 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.actions.BasicActionLookupValue;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
@@ -50,9 +50,9 @@
     return getStringHelper().add("collection", collection).toString();
   }
 
-  public static BuildInfoKeyAndConfig key(BuildInfoKey key, @Nullable BuildConfiguration config) {
-    return BuildInfoKeyAndConfig.create(
-        key, config == null ? null : BuildConfigurationValue.key(config));
+  public static BuildInfoKeyAndConfig key(
+      BuildInfoKey key, @Nullable BuildConfigurationValue config) {
+    return BuildInfoKeyAndConfig.create(key, config == null ? null : config.getKey());
   }
 
   /** Key for BuildInfoCollectionValues. */
@@ -62,16 +62,15 @@
         BlazeInterners.newWeakInterner();
 
     private final BuildInfoKey infoKey;
-    private final BuildConfigurationValue.Key configKey;
+    private final BuildConfigurationKey configKey;
 
-    private BuildInfoKeyAndConfig(BuildInfoKey key, BuildConfigurationValue.Key configKey) {
+    private BuildInfoKeyAndConfig(BuildInfoKey key, BuildConfigurationKey configKey) {
       this.infoKey = Preconditions.checkNotNull(key, configKey);
       this.configKey = Preconditions.checkNotNull(configKey, key);
     }
 
     @AutoCodec.Instantiator
-    static BuildInfoKeyAndConfig create(
-        BuildInfoKey infoKey, BuildConfigurationValue.Key configKey) {
+    static BuildInfoKeyAndConfig create(BuildInfoKey infoKey, BuildConfigurationKey configKey) {
       return keyInterner.intern(new BuildInfoKeyAndConfig(infoKey, configKey));
     }
 
@@ -84,7 +83,7 @@
       return infoKey;
     }
 
-    BuildConfigurationValue.Key getConfigKey() {
+    BuildConfigurationKey getConfigKey() {
       return configKey;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetAndData.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetAndData.java
index 1d06228..00fef49 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetAndData.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetAndData.java
@@ -19,7 +19,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -30,25 +30,26 @@
 
 /**
  * A container class for a {@link ConfiguredTarget} and associated data, {@link Target}, {@link
- * BuildConfiguration}, and transition keys. In the future, {@link ConfiguredTarget} objects will no
- * longer contain their associated {@link BuildConfiguration}. Consumers that need the {@link
- * Target} or {@link BuildConfiguration} must therefore have access to one of these objects.
+ * BuildConfigurationValue}, and transition keys. In the future, {@link ConfiguredTarget} objects
+ * will no longer contain their associated {@link BuildConfigurationValue}. Consumers that need the
+ * {@link Target} or {@link BuildConfigurationValue} must therefore have access to one of these
+ * objects.
  *
  * <p>These objects are intended to be short-lived, never stored in Skyframe, since they pair three
  * heavyweight objects, a {@link ConfiguredTarget}, a {@link Target} (which holds a {@link
- * com.google.devtools.build.lib.packages.Package}), and a {@link BuildConfiguration}.
+ * com.google.devtools.build.lib.packages.Package}), and a {@link BuildConfigurationValue}.
  */
 public class ConfiguredTargetAndData {
   private final ConfiguredTarget configuredTarget;
   private final Target target;
-  private final BuildConfiguration configuration;
+  private final BuildConfigurationValue configuration;
   private final ImmutableList<String> transitionKeys;
 
   @VisibleForTesting
   public ConfiguredTargetAndData(
       ConfiguredTarget configuredTarget,
       Target target,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       ImmutableList<String> transitionKeys) {
     this.configuredTarget = configuredTarget;
     this.target = target;
@@ -60,7 +61,7 @@
             + " ConfiguredTarget's label %s is not equal to Target's label %s",
         configuredTarget.getLabel(),
         target.getLabel());
-    BuildConfigurationValue.Key innerConfigurationKey = configuredTarget.getConfigurationKey();
+    BuildConfigurationKey innerConfigurationKey = configuredTarget.getConfigurationKey();
     if (configuration == null) {
       Preconditions.checkState(
           innerConfigurationKey == null,
@@ -68,7 +69,7 @@
           configuredTarget,
           target);
     } else {
-      BuildConfigurationValue.Key configurationKey = BuildConfigurationValue.key(configuration);
+      BuildConfigurationKey configurationKey = configuration.getKey();
       Preconditions.checkState(
           innerConfigurationKey.equals(configurationKey),
           "Configurations don't match: %s %s %s (%s %s)",
@@ -83,10 +84,10 @@
   @Nullable
   static ConfiguredTargetAndData fromConfiguredTargetInSkyframe(
       ConfiguredTarget ct, SkyFunction.Environment env) throws InterruptedException {
-    BuildConfiguration configuration = null;
+    BuildConfigurationValue configuration = null;
     ImmutableSet<SkyKey> packageAndMaybeConfiguration;
     PackageValue.Key packageKey = PackageValue.key(ct.getLabel().getPackageIdentifier());
-    BuildConfigurationValue.Key configurationKeyMaybe = ct.getConfigurationKey();
+    BuildConfigurationKey configurationKeyMaybe = ct.getConfigurationKey();
     if (configurationKeyMaybe == null) {
       packageAndMaybeConfiguration = ImmutableSet.of(packageKey);
     } else {
@@ -100,12 +101,11 @@
       return null;
     }
     if (configurationKeyMaybe != null) {
-      BuildConfigurationValue buildConfigurationValue =
+      configuration =
           (BuildConfigurationValue) packageAndMaybeConfigurationValues.get(configurationKeyMaybe);
-      if (buildConfigurationValue == null) {
+      if (configuration == null) {
         return null;
       }
-      configuration = buildConfigurationValue.getConfiguration();
     }
     try {
       return new ConfiguredTargetAndData(
@@ -130,7 +130,7 @@
     return target;
   }
 
-  public BuildConfiguration getConfiguration() {
+  public BuildConfigurationValue getConfiguration() {
     return configuration;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 7bdd7a7..4ee1e37 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainCollection;
 import com.google.devtools.build.lib.analysis.ToolchainContext;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptionsView;
 import com.google.devtools.build.lib.analysis.config.ConfigConditions;
@@ -199,7 +199,7 @@
 
     ConfiguredTargetKey configuredTargetKey = (ConfiguredTargetKey) key.argument();
     Label label = configuredTargetKey.getLabel();
-    BuildConfiguration configuration = null;
+    BuildConfigurationValue configuration = null;
     ImmutableSet<SkyKey> packageAndMaybeConfiguration;
     SkyKey packageKey = PackageValue.key(label.getPackageIdentifier());
     SkyKey configurationKeyMaybe = configuredTargetKey.getConfigurationKey();
@@ -216,8 +216,7 @@
     PackageValue packageValue = (PackageValue) packageAndMaybeConfigurationValues.get(packageKey);
     if (configurationKeyMaybe != null) {
       configuration =
-          ((BuildConfigurationValue) packageAndMaybeConfigurationValues.get(configurationKeyMaybe))
-              .getConfiguration();
+          (BuildConfigurationValue) packageAndMaybeConfigurationValues.get(configurationKeyMaybe);
     }
 
     // TODO(ulfjack): This tries to match the logic in TransitiveTargetFunction /
@@ -470,7 +469,7 @@
       return new ComputedToolchainContexts();
     }
     Rule rule = ((Rule) targetAndConfig.getTarget());
-    BuildConfiguration configuration = targetAndConfig.getConfiguration();
+    BuildConfigurationValue configuration = targetAndConfig.getConfiguration();
 
     ImmutableSet<Label> requiredDefaultToolchains =
         rule.getRuleClassObject().getRequiredToolchains();
@@ -522,8 +521,8 @@
                 toolchainTaggedTrimmingTransition.requiresOptionFragments()),
             env.getListener());
 
-    BuildConfigurationValue.Key toolchainConfig =
-        BuildConfigurationValue.keyWithoutPlatformMapping(
+    BuildConfigurationKey toolchainConfig =
+        BuildConfigurationKey.withoutPlatformMapping(
             configuration.fragmentClasses(), toolchainOptions);
 
     Map<String, ToolchainContextKey> toolchainContextKeys = new HashMap<>();
@@ -639,14 +638,14 @@
       @Nullable ToolchainCollection<ToolchainContext> toolchainContexts,
       boolean useToolchainTransition,
       RuleClassProvider ruleClassProvider,
-      BuildConfiguration hostConfiguration,
+      BuildConfigurationValue hostConfiguration,
       @Nullable NestedSetBuilder<Package> transitivePackagesForPackageRootResolution,
       NestedSetBuilder<Cause> transitiveRootCauses)
       throws DependencyEvaluationException, ConfiguredValueCreationException,
           AspectCreationException, InterruptedException {
     // Create the map from attributes to set of (target, transition) pairs.
     OrderedSetMultimap<DependencyKind, DependencyKey> initialDependencies;
-    BuildConfiguration configuration = ctgValue.getConfiguration();
+    BuildConfigurationValue configuration = ctgValue.getConfiguration();
     Label label = ctgValue.getLabel();
     try {
       initialDependencies =
@@ -891,12 +890,10 @@
               }
             }
             try {
-              BuildConfiguration depConfiguration = dep.getConfiguration();
-              BuildConfigurationValue.Key depKey =
-                  depValue.getConfiguredTarget().getConfigurationKey();
-              if (depKey != null && !depKey.equals(BuildConfigurationValue.key(depConfiguration))) {
-                depConfiguration =
-                    ((BuildConfigurationValue) env.getValue(depKey)).getConfiguration();
+              BuildConfigurationValue depConfiguration = dep.getConfiguration();
+              BuildConfigurationKey depKey = depValue.getConfiguredTarget().getConfigurationKey();
+              if (depKey != null && !depKey.equals(depConfiguration.getKey())) {
+                depConfiguration = (BuildConfigurationValue) env.getValue(depKey);
               }
               result.put(
                   key,
@@ -959,7 +956,7 @@
       @Nullable NestedSetBuilder<Package> transitivePackagesForPackageRootResolution)
       throws ConfiguredValueCreationException, InterruptedException {
     Target target = ctgValue.getTarget();
-    BuildConfiguration configuration = ctgValue.getConfiguration();
+    BuildConfigurationValue configuration = ctgValue.getConfiguration();
 
     // Should be successfully evaluated and cached from the loading phase.
     StarlarkBuiltinsValue starlarkBuiltinsValue =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index 0457e20..58d7587 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.Interner;
 import com.google.devtools.build.lib.actions.ActionLookupKey;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
@@ -29,34 +29,34 @@
 import javax.annotation.Nullable;
 
 /**
- * In simple form, a ({@link Label}, {@link BuildConfiguration}) pair used to trigger immediate
+ * In simple form, a ({@link Label}, {@link BuildConfigurationValue}) pair used to trigger immediate
  * dependency resolution and the rule analysis.
  *
- * <p>In practice, a ({@link Label}, canonical and post-transition {@link
- * BuildConfigurationValue.Key}) pair plus a possible execution platform override {@link Label} with
- * special constraints. To elaborate, in order of highest to lowest potential for concern:
+ * <p>In practice, a ({@link Label}, canonical and post-transition {@link BuildConfigurationKey})
+ * pair plus a possible execution platform override {@link Label} with special constraints. To
+ * elaborate, in order of highest to lowest potential for concern:
  *
- * <p>1. The {@link BuildConfigurationValue.Key} must be post-transition and thus ready for
- * immediate use in dependency resolution and analysis. In practice, this means that if the rule has
- * an incoming-edge transition (cfg in {@link RuleClass}) or there are global trimming transitions,
+ * <p>1. The {@link BuildConfigurationKey} must be post-transition and thus ready for immediate use
+ * in dependency resolution and analysis. In practice, this means that if the rule has an
+ * incoming-edge transition (cfg in {@link RuleClass}) or there are global trimming transitions,
  * THOSE TRANSITIONS MUST ALREADY BE DONE before creating the key. Failure to do so will lead to
- * build graphs with ConfiguredTarget that have seemingly impossible {@link BuildConfiguration} (due
- * to the skipped transitions).
+ * build graphs with ConfiguredTarget that have seemingly impossible {@link BuildConfigurationValue}
+ * (due to the skipped transitions).
  *
- * <p>2. The {@link BuildConfigurationValue.Key} must be canonical. Multiple keys can correspond to
- * the same {@link BuildConfiguration}. The canonical key is the one returned by {@link
- * BuildConfigurationValue.key}. Failure to use a canonical key can result in build graphs with
+ * <p>2. The {@link BuildConfigurationKey} must be canonical. Multiple keys can correspond to the
+ * same {@link BuildConfigurationValue}. The canonical key is the one returned by {@link
+ * BuildConfigurationValue#getKey}. Failure to use a canonical key can result in build graphs with
  * multiple seemingly-identical ConfiguredTarget that have the same ({@link Label}, {@link
- * BuildConfiguration}) pair. This is non-performant in all cases and incorrect if those
+ * BuildConfigurationValue}) pair. This is non-performant in all cases and incorrect if those
  * duplications lead to action conflicts due to unsharable actions.
  *
- * <p>3. A build should not request keys with equal ({@link Label}, {@link BuildConfiguration})
+ * <p>3. A build should not request keys with equal ({@link Label}, {@link BuildConfigurationValue})
  * pairs but different execution platform override {@link Label} if the invoked rule will register
  * actions. (This is potentially OK if all outputs of all registered actions incorporate the
  * execution platform in their name unless the build also requests keys without an override that
  * happen to resolve to the same execution platform.) In practice, this issue has not been seen in
  * any 'real' builds; however, pathologically failure could lead to multiple (potentially different)
- * ConfiguredTarget that have the same ({@link Label}, {@link BuildConfiguration}) pair.
+ * ConfiguredTarget that have the same ({@link Label}, {@link BuildConfigurationValue}) pair.
  *
  * <p>Note that this key may be used to look up the generating action of an artifact.
  */
@@ -69,12 +69,11 @@
   private static final Interner<ConfiguredTargetKey> interner = BlazeInterners.newWeakInterner();
 
   private final Label label;
-  @Nullable private final BuildConfigurationValue.Key configurationKey;
+  @Nullable private final BuildConfigurationKey configurationKey;
 
   private final transient int hashCode;
 
-  ConfiguredTargetKey(
-      Label label, @Nullable BuildConfigurationValue.Key configurationKey, int hashCode) {
+  ConfiguredTargetKey(Label label, @Nullable BuildConfigurationKey configurationKey, int hashCode) {
     this.label = checkNotNull(label);
     this.configurationKey = configurationKey;
     this.hashCode = hashCode;
@@ -82,8 +81,7 @@
 
   @AutoCodec.VisibleForSerialization
   @AutoCodec.Instantiator
-  static ConfiguredTargetKey create(
-      Label label, @Nullable BuildConfigurationValue.Key configurationKey) {
+  static ConfiguredTargetKey create(Label label, @Nullable BuildConfigurationKey configurationKey) {
     int hashCode = computeHashCode(label, configurationKey, /*executionPlatformLabel=*/ null);
     return interner.intern(new ConfiguredTargetKey(label, configurationKey, hashCode));
   }
@@ -106,7 +104,7 @@
   }
 
   @Nullable
-  public final BuildConfigurationValue.Key getConfigurationKey() {
+  public final BuildConfigurationKey getConfigurationKey() {
     return configurationKey;
   }
 
@@ -122,7 +120,7 @@
 
   private static int computeHashCode(
       Label label,
-      @Nullable BuildConfigurationValue.Key configurationKey,
+      @Nullable BuildConfigurationKey configurationKey,
       @Nullable Label executionPlatformLabel) {
     int configVal = configurationKey == null ? 79 : configurationKey.hashCode();
     int executionPlatformLabelVal =
@@ -175,7 +173,7 @@
 
     private ToolchainDependencyConfiguredTargetKey(
         Label label,
-        @Nullable BuildConfigurationValue.Key configurationKey,
+        @Nullable BuildConfigurationKey configurationKey,
         int hashCode,
         Label executionPlatformLabel) {
       super(label, configurationKey, hashCode);
@@ -186,7 +184,7 @@
     @AutoCodec.Instantiator
     static ToolchainDependencyConfiguredTargetKey create(
         Label label,
-        @Nullable BuildConfigurationValue.Key configurationKey,
+        @Nullable BuildConfigurationKey configurationKey,
         Label executionPlatformLabel) {
       int hashCode = computeHashCode(label, configurationKey, executionPlatformLabel);
       return toolchainDependencyConfiguredTargetKeyInterner.intern(
@@ -208,7 +206,7 @@
   /** A helper class to create instances of {@link ConfiguredTargetKey}. */
   public static final class Builder {
     private Label label = null;
-    private BuildConfigurationValue.Key configurationKey = null;
+    private BuildConfigurationKey configurationKey = null;
     private Label executionPlatformLabel = null;
 
     private Builder() {}
@@ -232,17 +230,13 @@
       return this;
     }
 
-    /** Sets the {@link BuildConfiguration} for the configured target. */
-    public Builder setConfiguration(@Nullable BuildConfiguration buildConfiguration) {
-      if (buildConfiguration == null) {
-        return setConfigurationKey(null);
-      } else {
-        return setConfigurationKey(BuildConfigurationValue.key(buildConfiguration));
-      }
+    /** Sets the {@link BuildConfigurationValue} for the configured target. */
+    public Builder setConfiguration(@Nullable BuildConfigurationValue buildConfiguration) {
+      return setConfigurationKey(buildConfiguration == null ? null : buildConfiguration.getKey());
     }
 
     /** Sets the configuration key for the configured target. */
-    public Builder setConfigurationKey(@Nullable BuildConfigurationValue.Key configurationKey) {
+    public Builder setConfigurationKey(@Nullable BuildConfigurationKey configurationKey) {
       this.configurationKey = configurationKey;
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingValue.java
index d2d5687..2f614ae 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingValue.java
@@ -48,7 +48,7 @@
 
 /**
  * Stores contents of a platforms/flags mapping file for transforming one {@link
- * BuildConfigurationValue.Key} into another.
+ * BuildConfigurationKey} into another.
  *
  * <p>See <a href=https://docs.google.com/document/d/1Vg_tPgiZbSrvXcJ403vZVAGlsWhH9BUDrAxMOYnO0Ls>
  * the design</a> for more details on how the mapping can be defined and the desired logic on how it
@@ -140,7 +140,7 @@
   private final ImmutableMap<ImmutableSet<String>, Label> flagsToPlatforms;
   private final ImmutableSet<Class<? extends FragmentOptions>> optionsClasses;
   private final LoadingCache<ImmutableSet<String>, OptionsParsingResult> parserCache;
-  private final LoadingCache<BuildConfigurationValue.Key, BuildConfigurationValue.Key> mappingCache;
+  private final LoadingCache<BuildConfigurationKey, BuildConfigurationKey> mappingCache;
 
   /**
    * Creates a new mapping value which will match on the given platforms (if a target platform is
@@ -167,7 +167,7 @@
   }
 
   /**
-   * Maps one {@link BuildConfigurationValue.Key} to another by way of mappings provided in a file.
+   * Maps one {@link BuildConfigurationKey} to another by way of mappings provided in a file.
    *
    * <p>The <a href=https://docs.google.com/document/d/1Vg_tPgiZbSrvXcJ403vZVAGlsWhH9BUDrAxMOYnO0Ls>
    * full design</a> contains the details for the mapping logic but in short:
@@ -186,8 +186,7 @@
    * @throws IllegalArgumentException if the original does not contain a {@link PlatformOptions}
    *     fragment
    */
-  public BuildConfigurationValue.Key map(BuildConfigurationValue.Key original)
-      throws OptionsParsingException {
+  public BuildConfigurationKey map(BuildConfigurationKey original) throws OptionsParsingException {
     try {
       return mappingCache.get(original);
     } catch (CompletionException e) {
@@ -196,7 +195,7 @@
     }
   }
 
-  private BuildConfigurationValue.Key computeMapping(BuildConfigurationValue.Key original)
+  private BuildConfigurationKey computeMapping(BuildConfigurationKey original)
       throws OptionsParsingException {
     BuildOptions originalOptions = original.getOptions();
 
@@ -238,8 +237,7 @@
       }
     }
 
-    return BuildConfigurationValue.keyWithoutPlatformMapping(
-        original.getFragments(), modifiedOptions);
+    return BuildConfigurationKey.withoutPlatformMapping(original.getFragments(), modifiedOptions);
   }
 
   private OptionsParsingResult parseWithCache(ImmutableSet<String> args)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java
index 1a92d5e..45a4629 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseFunction.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.analysis.DependencyKey;
 import com.google.devtools.build.lib.analysis.PlatformOptions;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptionsView;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
@@ -93,17 +93,17 @@
     List<BuildOptions> topLevelBuildOptions =
         getTopLevelBuildOptions(targetOptions, options.getMultiCpu());
 
-    ImmutableList.Builder<BuildConfigurationValue.Key> targetConfigurationKeysBuilder =
+    ImmutableList.Builder<BuildConfigurationKey> targetConfigurationKeysBuilder =
         ImmutableList.builderWithExpectedSize(topLevelBuildOptions.size());
-    BuildConfigurationValue.Key hostConfigurationKey;
+    BuildConfigurationKey hostConfigurationKey;
     try {
       hostConfigurationKey =
-          BuildConfigurationValue.keyWithPlatformMapping(
+          BuildConfigurationKey.withPlatformMapping(
               platformMappingValue, allFragments, hostOptions);
       for (BuildOptions buildOptions :
           getTopLevelBuildOptions(targetOptions, options.getMultiCpu())) {
         targetConfigurationKeysBuilder.add(
-            BuildConfigurationValue.keyWithPlatformMapping(
+            BuildConfigurationKey.withPlatformMapping(
                 platformMappingValue, allFragments, buildOptions));
       }
     } catch (OptionsParsingException e) {
@@ -117,7 +117,7 @@
       throw new PrepareAnalysisPhaseFunctionException(e);
     }
 
-    ImmutableList<BuildConfigurationValue.Key> targetConfigurationKeys =
+    ImmutableList<BuildConfigurationKey> targetConfigurationKeys =
         targetConfigurationKeysBuilder.build();
     Map<SkyKey, SkyValue> configs = env.getValues(targetConfigurationKeys);
 
@@ -127,7 +127,7 @@
     targetConfigurationKeys.stream()
         .map(configs::get)
         .filter(Objects::nonNull)
-        .map(v -> ((BuildConfigurationValue) v).getConfiguration())
+        .map(BuildConfigurationValue.class::cast)
         .forEach(config -> config.reportInvalidOptions(nosyEventHandler));
     if (nosyEventHandler.hasErrors()) {
       throw new PrepareAnalysisPhaseFunctionException(
@@ -148,9 +148,8 @@
     // groups.
     LinkedHashSet<TargetAndConfiguration> nodes = new LinkedHashSet<>(targets.size());
     for (Target target : targets) {
-      for (BuildConfigurationValue.Key configKey : targetConfigurationKeys) {
-        BuildConfiguration config =
-            ((BuildConfigurationValue) configs.get(configKey)).getConfiguration();
+      for (BuildConfigurationKey configKey : targetConfigurationKeys) {
+        BuildConfigurationValue config = (BuildConfigurationValue) configs.get(configKey);
         nodes.add(new TargetAndConfiguration(target, config));
       }
     }
@@ -160,7 +159,7 @@
     // for now, to satisfy its API we resolve transitions and repackage each target as a Dependency
     // (with a NONE transition if necessary).
     // Keep this in sync with AnalysisUtils#getTargetsWithConfigs.
-    Multimap<BuildConfiguration, DependencyKey> asDeps =
+    Multimap<BuildConfigurationValue, DependencyKey> asDeps =
         AnalysisUtils.targetsToDeps(nodes, ruleClassProvider);
     LinkedHashSet<TargetAndConfiguration> topLevelTargetsWithConfigs;
     try {
@@ -212,7 +211,7 @@
   private LinkedHashSet<TargetAndConfiguration> resolveConfigurations(
       SkyFunction.Environment env,
       Iterable<TargetAndConfiguration> nodes,
-      Multimap<BuildConfiguration, DependencyKey> asDeps)
+      Multimap<BuildConfigurationValue, DependencyKey> asDeps)
       throws InterruptedException, TransitionException, OptionsParsingException {
     Map<Label, Target> labelsToTargets = new LinkedHashMap<>();
     for (TargetAndConfiguration node : nodes) {
@@ -223,13 +222,14 @@
     // could be successfully Skyframe-evaluated.
     Map<TargetAndConfiguration, TargetAndConfiguration> successfullyEvaluatedTargets =
         new LinkedHashMap<>();
-    for (BuildConfiguration fromConfig : asDeps.keySet()) {
-      Multimap<DependencyKey, BuildConfiguration> trimmedTargets =
+    for (BuildConfigurationValue fromConfig : asDeps.keySet()) {
+      Multimap<DependencyKey, BuildConfigurationValue> trimmedTargets =
           getConfigurations(env, fromConfig.getOptions(), asDeps.get(fromConfig));
       if (trimmedTargets == null) {
         continue;
       }
-      for (Map.Entry<DependencyKey, BuildConfiguration> trimmedTarget : trimmedTargets.entries()) {
+      for (Map.Entry<DependencyKey, BuildConfigurationValue> trimmedTarget :
+          trimmedTargets.entries()) {
         Target target = labelsToTargets.get(trimmedTarget.getKey().getLabel());
         successfullyEvaluatedTargets.put(
             new TargetAndConfiguration(target, fromConfig),
@@ -251,10 +251,10 @@
 
   // Keep in sync with {@link SkyframeExecutor#getConfigurations}.
   // Note: this implementation runs inside Skyframe, so it has access to SkyFunction.Environment.
-  private Multimap<DependencyKey, BuildConfiguration> getConfigurations(
+  private Multimap<DependencyKey, BuildConfigurationValue> getConfigurations(
       SkyFunction.Environment env, BuildOptions fromOptions, Iterable<DependencyKey> keys)
       throws InterruptedException, TransitionException, OptionsParsingException {
-    Multimap<DependencyKey, BuildConfiguration> builder = ArrayListMultimap.create();
+    Multimap<DependencyKey, BuildConfigurationValue> builder = ArrayListMultimap.create();
 
     FragmentClassSet allFragments = ruleClassProvider.getFragmentRegistry().getAllFragments();
 
@@ -284,7 +284,7 @@
               .values();
       for (BuildOptions toOption : toOptions) {
         configSkyKeys.add(
-            BuildConfigurationValue.keyWithPlatformMapping(
+            BuildConfigurationKey.withPlatformMapping(
                 platformMappingValue, allFragments, toOption));
       }
     }
@@ -310,14 +310,13 @@
               .values();
       for (BuildOptions toOption : toOptions) {
         SkyKey configKey =
-            BuildConfigurationValue.keyWithPlatformMapping(
-                platformMappingValue, allFragments, toOption);
+            BuildConfigurationKey.withPlatformMapping(platformMappingValue, allFragments, toOption);
         BuildConfigurationValue configValue =
-            ((BuildConfigurationValue) configsResult.get(configKey));
+            (BuildConfigurationValue) configsResult.get(configKey);
         // configValue will be null here if there was an exception thrown during configuration
         // creation. This will be reported elsewhere.
         if (configValue != null) {
-          builder.put(key, configValue.getConfiguration());
+          builder.put(key, configValue);
         }
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseValue.java
index 2556a89..d722007 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareAnalysisPhaseValue.java
@@ -20,8 +20,8 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver.TopLevelTargetsAndConfigsResult;
 import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
@@ -63,13 +63,13 @@
 @ThreadSafe
 @AutoCodec
 public final class PrepareAnalysisPhaseValue implements SkyValue {
-  private final BuildConfigurationValue.Key hostConfigurationKey;
-  private final ImmutableList<BuildConfigurationValue.Key> targetConfigurationKeys;
+  private final BuildConfigurationKey hostConfigurationKey;
+  private final ImmutableList<BuildConfigurationKey> targetConfigurationKeys;
   private final ImmutableList<ConfiguredTargetKey> topLevelCtKeys;
 
   PrepareAnalysisPhaseValue(
-      BuildConfigurationValue.Key hostConfigurationKey,
-      ImmutableList<BuildConfigurationValue.Key> targetConfigurationKeys,
+      BuildConfigurationKey hostConfigurationKey,
+      ImmutableList<BuildConfigurationKey> targetConfigurationKeys,
       ImmutableList<ConfiguredTargetKey> topLevelCtKeys) {
     this.hostConfigurationKey = Preconditions.checkNotNull(hostConfigurationKey);
     this.targetConfigurationKeys = Preconditions.checkNotNull(targetConfigurationKeys);
@@ -83,9 +83,9 @@
   public BuildConfigurationCollection getConfigurations(
       ExtendedEventHandler eventHandler, SkyframeExecutor skyframeExecutor)
           throws InvalidConfigurationException {
-    BuildConfiguration hostConfiguration =
+    BuildConfigurationValue hostConfiguration =
         skyframeExecutor.getConfiguration(eventHandler, hostConfigurationKey);
-    ImmutableList<BuildConfiguration> targetConfigurations =
+    ImmutableList<BuildConfigurationValue> targetConfigurations =
         ImmutableList.copyOf(
             skyframeExecutor.getConfigurations(eventHandler, targetConfigurationKeys).values());
     return new BuildConfigurationCollection(targetConfigurations, hostConfiguration);
@@ -102,7 +102,7 @@
   public TopLevelTargetsAndConfigsResult getTopLevelCts(
       ExtendedEventHandler eventHandler, SkyframeExecutor skyframeExecutor) {
     List<TargetAndConfiguration> result = new ArrayList<>();
-    Map<BuildConfigurationValue.Key, BuildConfiguration> configs =
+    Map<BuildConfigurationKey, BuildConfigurationValue> configs =
         skyframeExecutor.getConfigurations(
             eventHandler,
             topLevelCtKeys.stream()
@@ -124,7 +124,7 @@
         hasError = true;
         continue;
       }
-      BuildConfiguration config =
+      BuildConfigurationValue config =
           key.getConfigurationKey() == null ? null : configs.get(key.getConfigurationKey());
       result.add(new TargetAndConfiguration(target, config));
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java
index 60d6ca2..cc47b00 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
 import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionValue;
@@ -67,7 +67,7 @@
   public SkyValue compute(SkyKey skyKey, Environment env)
       throws RegisteredExecutionPlatformsFunctionException, InterruptedException {
 
-    BuildConfigurationValue buildConfigurationValue =
+    BuildConfigurationValue configuration =
         (BuildConfigurationValue)
             env.getValue(((RegisteredExecutionPlatformsValue.Key) skyKey).getConfigurationKey());
     RepositoryMappingValue mainRepoMapping =
@@ -75,7 +75,6 @@
     if (env.valuesMissing()) {
       return null;
     }
-    BuildConfiguration configuration = buildConfigurationValue.getConfiguration();
 
     TargetPattern.Parser mainRepoParser =
         new TargetPattern.Parser(
@@ -186,7 +185,7 @@
   }
 
   private static ImmutableList<ConfiguredTargetKey> configureRegisteredExecutionPlatforms(
-      Environment env, BuildConfiguration configuration, List<Label> labels)
+      Environment env, BuildConfigurationValue configuration, List<Label> labels)
       throws InterruptedException, RegisteredExecutionPlatformsFunctionException {
     ImmutableList<ConfiguredTargetKey> keys =
         labels.stream()
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsValue.java
index b552777..df534c0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsValue.java
@@ -31,7 +31,7 @@
 public abstract class RegisteredExecutionPlatformsValue implements SkyValue {
 
   /** Returns the {@link SkyKey} for {@link RegisteredExecutionPlatformsValue}s. */
-  public static SkyKey key(BuildConfigurationValue.Key configurationKey) {
+  public static SkyKey key(BuildConfigurationKey configurationKey) {
     return Key.of(configurationKey);
   }
 
@@ -41,15 +41,15 @@
   static class Key implements SkyKey {
     private static final Interner<Key> interners = BlazeInterners.newWeakInterner();
 
-    private final BuildConfigurationValue.Key configurationKey;
+    private final BuildConfigurationKey configurationKey;
 
-    private Key(BuildConfigurationValue.Key configurationKey) {
+    private Key(BuildConfigurationKey configurationKey) {
       this.configurationKey = configurationKey;
     }
 
     @AutoCodec.Instantiator
     @AutoCodec.VisibleForSerialization
-    static Key of(BuildConfigurationValue.Key configurationKey) {
+    static Key of(BuildConfigurationKey configurationKey) {
       return interners.intern(new Key(configurationKey));
     }
 
@@ -58,7 +58,7 @@
       return SkyFunctions.REGISTERED_EXECUTION_PLATFORMS;
     }
 
-    BuildConfigurationValue.Key getConfigurationKey() {
+    BuildConfigurationKey getConfigurationKey() {
       return configurationKey;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
index d22fe77..1e0e17b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.platform.DeclaredToolchainInfo;
 import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionValue;
@@ -59,7 +59,7 @@
   public SkyValue compute(SkyKey skyKey, Environment env)
       throws SkyFunctionException, InterruptedException {
 
-    BuildConfigurationValue buildConfigurationValue =
+    BuildConfigurationValue configuration =
         (BuildConfigurationValue)
             env.getValue(((RegisteredToolchainsValue.Key) skyKey).getConfigurationKey());
     RepositoryMappingValue mainRepoMapping =
@@ -67,7 +67,6 @@
     if (env.valuesMissing()) {
       return null;
     }
-    BuildConfiguration configuration = buildConfigurationValue.getConfiguration();
 
     TargetPattern.Parser mainRepoParser =
         new TargetPattern.Parser(
@@ -176,7 +175,7 @@
   }
 
   private static ImmutableList<DeclaredToolchainInfo> configureRegisteredToolchains(
-      Environment env, BuildConfiguration configuration, List<Label> labels)
+      Environment env, BuildConfigurationValue configuration, List<Label> labels)
       throws InterruptedException, RegisteredToolchainsFunctionException {
     ImmutableList<SkyKey> keys =
         labels.stream()
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java
index 17c7fca..49e8042 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsValue.java
@@ -33,7 +33,7 @@
 public abstract class RegisteredToolchainsValue implements SkyValue {
 
   /** Returns the {@link SkyKey} for {@link RegisteredToolchainsValue}s. */
-  public static Key key(BuildConfigurationValue.Key configurationKey) {
+  public static Key key(BuildConfigurationKey configurationKey) {
     return Key.of(configurationKey);
   }
 
@@ -42,15 +42,15 @@
   static class Key implements SkyKey {
     private static final Interner<Key> interners = BlazeInterners.newWeakInterner();
 
-    private final BuildConfigurationValue.Key configurationKey;
+    private final BuildConfigurationKey configurationKey;
 
-    private Key(BuildConfigurationValue.Key configurationKey) {
+    private Key(BuildConfigurationKey configurationKey) {
       this.configurationKey = configurationKey;
     }
 
     @AutoCodec.Instantiator
     @AutoCodec.VisibleForSerialization
-    static Key of(BuildConfigurationValue.Key configurationKey) {
+    static Key of(BuildConfigurationKey configurationKey) {
       return interners.intern(new Key(configurationKey));
     }
 
@@ -59,7 +59,7 @@
       return SkyFunctions.REGISTERED_TOOLCHAINS;
     }
 
-    BuildConfigurationValue.Key getConfigurationKey() {
+    BuildConfigurationKey getConfigurationKey() {
       return configurationKey;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunction.java
index f8eef44..bbdbf6a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunction.java
@@ -21,7 +21,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
 import com.google.devtools.build.lib.analysis.platform.ConstraintCollection;
 import com.google.devtools.build.lib.analysis.platform.ConstraintSettingInfo;
@@ -58,11 +58,11 @@
 
     // This call could be combined with the call below, but this SkyFunction is evaluated so rarely
     // it's not worth optimizing.
-    BuildConfigurationValue value = (BuildConfigurationValue) env.getValue(key.configurationKey());
+    BuildConfigurationValue configuration =
+        (BuildConfigurationValue) env.getValue(key.configurationKey());
     if (env.valuesMissing()) {
       return null;
     }
-    BuildConfiguration configuration = value.getConfiguration();
 
     // Get all toolchains.
     RegisteredToolchainsValue toolchains;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionValue.java
index a503798..e021b47 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionValue.java
@@ -35,7 +35,7 @@
 
   // A key representing the input data.
   public static SingleToolchainResolutionKey key(
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       Label toolchainTypeLabel,
       ConfiguredTargetKey targetPlatformKey,
       List<ConfiguredTargetKey> availableExecutionPlatformKeys) {
@@ -48,7 +48,7 @@
   }
 
   public static SingleToolchainResolutionKey key(
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       Label toolchainTypeLabel,
       ConfiguredTargetKey targetPlatformKey,
       List<ConfiguredTargetKey> availableExecutionPlatformKeys,
@@ -72,7 +72,7 @@
       return SkyFunctions.SINGLE_TOOLCHAIN_RESOLUTION;
     }
 
-    abstract BuildConfigurationValue.Key configurationKey();
+    abstract BuildConfigurationKey configurationKey();
 
     public abstract Label toolchainTypeLabel();
 
@@ -84,7 +84,7 @@
 
     @AutoCodec.Instantiator
     static SingleToolchainResolutionKey create(
-        BuildConfigurationValue.Key configurationKey,
+        BuildConfigurationKey configurationKey,
         Label toolchainTypeLabel,
         ConfiguredTargetKey targetPlatformKey,
         List<ConfiguredTargetKey> availableExecutionPlatformKeys,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index a7eb585..6c5f9fe 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -53,8 +53,8 @@
 import com.google.devtools.build.lib.analysis.ToolchainCollection;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiff;
 import com.google.devtools.build.lib.analysis.config.ConfigConditions;
@@ -144,7 +144,7 @@
   private final ConfiguredRuleClassProvider ruleClassProvider;
 
   // The host configuration containing all fragments used by this build's transitive closure.
-  private BuildConfiguration topLevelHostConfiguration;
+  private BuildConfigurationValue topLevelHostConfiguration;
 
   private BuildConfigurationCollection configurations;
 
@@ -206,15 +206,16 @@
       return null;
     }
 
-    ImmutableList<BuildConfiguration> oldTargetConfigs =
+    ImmutableList<BuildConfigurationValue> oldTargetConfigs =
         this.configurations.getTargetConfigurations();
-    ImmutableList<BuildConfiguration> newTargetConfigs = configurations.getTargetConfigurations();
+    ImmutableList<BuildConfigurationValue> newTargetConfigs =
+        configurations.getTargetConfigurations();
 
     // TODO(schmitt): We are only checking the first of the new configurations, even though (through
     //  split transitions) we could have more than one. There is some special handling for
     //  --cpu changing below but other options may also be changed and should be covered.
-    BuildConfiguration oldConfig = oldTargetConfigs.get(0);
-    BuildConfiguration newConfig = newTargetConfigs.get(0);
+    BuildConfigurationValue oldConfig = oldTargetConfigs.get(0);
+    BuildConfigurationValue newConfig = newTargetConfigs.get(0);
     OptionsDiff diff = BuildOptions.diff(oldConfig.getOptions(), newConfig.getOptions());
 
     ImmutableSet<OptionDefinition> nativeCacheInvalidatingDifferences =
@@ -264,9 +265,9 @@
   // TODO(schmitt): This method assumes that the only option that can cause multiple target
   //  configurations is --cpu which (with the presence of split transitions) is no longer true.
   private ImmutableSet<OptionDefinition> getNativeCacheInvalidatingDifferences(
-      ImmutableList<BuildConfiguration> oldTargetConfigs,
-      ImmutableList<BuildConfiguration> newTargetConfigs,
-      BuildConfiguration newConfig,
+      ImmutableList<BuildConfigurationValue> oldTargetConfigs,
+      ImmutableList<BuildConfigurationValue> newTargetConfigs,
+      BuildConfigurationValue newConfig,
       OptionsDiff diff) {
     Stream<OptionDefinition> nativeCacheInvalidatingDifferences =
         diff.getFirst().keySet().stream()
@@ -292,9 +293,9 @@
           nativeCacheInvalidatingDifferences.filter(
               (definition) -> !CoreOptions.CPU.equals(definition));
       ImmutableSet<String> oldCpus =
-          oldTargetConfigs.stream().map(BuildConfiguration::getCpu).collect(toImmutableSet());
+          oldTargetConfigs.stream().map(BuildConfigurationValue::getCpu).collect(toImmutableSet());
       ImmutableSet<String> newCpus =
-          newTargetConfigs.stream().map(BuildConfiguration::getCpu).collect(toImmutableSet());
+          newTargetConfigs.stream().map(BuildConfigurationValue::getCpu).collect(toImmutableSet());
       if (!Objects.equals(oldCpus, newCpus)) {
         // --experimental_multi_cpu has changed, so inject that in the diff stream.
         nativeCacheInvalidatingDifferences =
@@ -347,7 +348,7 @@
    * Sets the host configuration consisting of all fragments that will be used by the top level
    * targets' transitive closures.
    */
-  private void setTopLevelHostConfiguration(BuildConfiguration topLevelHostConfiguration) {
+  private void setTopLevelHostConfiguration(BuildConfigurationValue topLevelHostConfiguration) {
     if (!topLevelHostConfiguration.equals(this.topLevelHostConfiguration)) {
       this.topLevelHostConfiguration = topLevelHostConfiguration;
     }
@@ -375,7 +376,7 @@
       ExtendedEventHandler eventHandler,
       List<ConfiguredTargetKey> ctKeys,
       ImmutableList<TopLevelAspectsKey> topLevelAspectsKeys,
-      Supplier<Map<BuildConfigurationValue.Key, BuildConfiguration>> configurationLookupSupplier,
+      Supplier<Map<BuildConfigurationKey, BuildConfigurationValue>> configurationLookupSupplier,
       TopLevelArtifactContext topLevelArtifactContextForConflictPruning,
       EventBus eventBus,
       boolean keepGoing,
@@ -565,7 +566,7 @@
           }
           AnalysisFailedCause failedCause =
               makeArtifactConflictAnalysisFailedCause(configurationLookupSupplier, e.get());
-          BuildConfigurationValue.Key configKey =
+          BuildConfigurationKey configKey =
               ctKey instanceof ConfiguredTargetKey
                   ? ((ConfiguredTargetKey) ctKey).getConfigurationKey()
                   : ((AspectKey) ctKey).getAspectConfigurationKey();
@@ -695,7 +696,7 @@
   }
 
   private static AnalysisFailedCause makeArtifactConflictAnalysisFailedCause(
-      Supplier<Map<BuildConfigurationValue.Key, BuildConfiguration>> configurationLookupSupplier,
+      Supplier<Map<BuildConfigurationKey, BuildConfigurationValue>> configurationLookupSupplier,
       ConflictException e) {
     try {
       throw e.rethrowTyped();
@@ -707,16 +708,16 @@
   }
 
   private static AnalysisFailedCause makeArtifactConflictAnalysisFailedCause(
-      Supplier<Map<BuildConfigurationValue.Key, BuildConfiguration>> configurationLookupSupplier,
+      Supplier<Map<BuildConfigurationKey, BuildConfigurationValue>> configurationLookupSupplier,
       ActionConflictException ace) {
     DetailedExitCode detailedExitCode = ace.getDetailedExitCode();
     Label causeLabel = ace.getArtifact().getArtifactOwner().getLabel();
-    BuildConfigurationValue.Key causeConfigKey = null;
+    BuildConfigurationKey causeConfigKey = null;
     if (ace.getArtifact().getArtifactOwner() instanceof ConfiguredTargetKey) {
       causeConfigKey =
           ((ConfiguredTargetKey) ace.getArtifact().getArtifactOwner()).getConfigurationKey();
     }
-    BuildConfiguration causeConfig =
+    BuildConfigurationValue causeConfig =
         causeConfigKey == null ? null : configurationLookupSupplier.get().get(causeConfigKey);
     return new AnalysisFailedCause(
         causeLabel,
@@ -797,14 +798,15 @@
    * keepGoing} is false.
    *
    * <p>Visible only for use by tests via {@link
-   * SkyframeExecutor#getConfiguredTargetMapForTesting(ExtendedEventHandler, BuildConfiguration,
-   * Iterable)}. When called there, {@code eventBus} must be null to indicate that this is a test,
-   * and so there may be additional {@link SkyKey}s in the {@code result} that are not {@link
-   * AspectKeyCreator}s or {@link ConfiguredTargetKey}s. Those keys will be ignored.
+   * SkyframeExecutor#getConfiguredTargetMapForTesting(ExtendedEventHandler,
+   * BuildConfigurationValue, Iterable)}. When called there, {@code eventBus} must be null to
+   * indicate that this is a test, and so there may be additional {@link SkyKey}s in the {@code
+   * result} that are not {@link AspectKeyCreator}s or {@link ConfiguredTargetKey}s. Those keys will
+   * be ignored.
    */
   static Pair<Boolean, ViewCreationFailedException> processErrors(
       EvaluationResult<? extends SkyValue> result,
-      Supplier<Map<BuildConfigurationValue.Key, BuildConfiguration>> configurationLookupSupplier,
+      Supplier<Map<BuildConfigurationKey, BuildConfigurationValue>> configurationLookupSupplier,
       SkyframeExecutor skyframeExecutor,
       ExtendedEventHandler eventHandler,
       boolean keepGoing,
@@ -897,7 +899,7 @@
       } else if (cause instanceof NoSuchPackageException) {
         // This branch is only taken in --nokeep_going builds. In a --keep_going build, the
         // AnalysisFailedCause is properly reported through the ConfiguredValueCreationException.
-        BuildConfiguration configuration =
+        BuildConfigurationValue configuration =
             configurationLookupSupplier.get().get(label.getConfigurationKey());
         ConfigurationId configId = configuration.getEventId().getConfiguration();
         AnalysisFailedCause analysisFailedCause =
@@ -922,7 +924,7 @@
       }
 
       if (!inTest) {
-        BuildConfiguration configuration =
+        BuildConfigurationValue configuration =
             configurationLookupSupplier.get().get(label.getConfigurationKey());
         eventBus.post(
             new AnalysisFailureEvent(
@@ -1067,7 +1069,7 @@
       ActionLookupKey owner,
       ExtendedEventHandler eventHandler,
       Environment env,
-      BuildConfiguration config,
+      BuildConfigurationValue config,
       StarlarkBuiltinsValue starlarkBuiltinsValue) {
     boolean extendedSanityChecks = config != null && config.extendedSanityChecks();
     boolean allowAnalysisFailures = config != null && config.allowAnalysisFailures();
@@ -1092,7 +1094,7 @@
   @Nullable
   ConfiguredTarget createConfiguredTarget(
       Target target,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       CachingAnalysisEnvironment analysisEnvironment,
       ConfiguredTargetKey configuredTargetKey,
       OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
@@ -1124,7 +1126,7 @@
    * <p>This may only be called after {@link #setTopLevelHostConfiguration} has set the correct host
    * configuration at the top-level.
    */
-  public BuildConfiguration getHostConfiguration() {
+  public BuildConfigurationValue getHostConfiguration() {
     return topLevelHostConfiguration;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
index c176128..bc7cd48 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.analysis.DependencyKind;
 import com.google.devtools.build.lib.analysis.DependencyResolver;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.ConfigurationId;
 import com.google.devtools.build.lib.causes.AnalysisFailedCause;
 import com.google.devtools.build.lib.causes.Cause;
@@ -145,7 +145,7 @@
                           fromTarget.getLabel(), label, label.getRepository(), e.getMessage())));
           continue;
         }
-        @Nullable BuildConfiguration configuration = fromNode.getConfiguration();
+        @Nullable BuildConfigurationValue configuration = fromNode.getConfiguration();
         @Nullable ConfigurationId configId = null;
         if (configuration != null) {
           configId =  configuration.getEventId().getConfiguration();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index da36b1d..2bb0fd1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -13,13 +13,16 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
+import static com.google.common.collect.ImmutableList.toImmutableList;
 import static com.google.devtools.build.lib.concurrent.Uninterruptibles.callUninterruptibly;
 import static com.google.devtools.build.lib.skyframe.ArtifactConflictFinder.ACTION_CONFLICTS;
 import static com.google.devtools.build.lib.skyframe.ArtifactConflictFinder.NUM_JOBS;
+import static java.util.stream.Collectors.toMap;
 
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Functions;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
@@ -85,8 +88,8 @@
 import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.BuildOptionsView;
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
@@ -230,7 +233,6 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import net.starlark.java.eval.StarlarkSemantics;
 
@@ -1141,14 +1143,14 @@
     return basicAnalysisInvalidatingPredicate(key) || key instanceof ActionLookupData;
   }
 
-  // We may also want to remove BuildConfigurationValue.Keys to fix a minor memory leak there.
+  // We may also want to remove BuildConfigurationKey to fix a minor memory leak there.
   private static boolean fullAnalysisInvalidatingPredicate(SkyKey key) {
-    return basicAnalysisInvalidatingPredicate(key) || key instanceof BuildConfigurationValue.Key;
+    return basicAnalysisInvalidatingPredicate(key) || key instanceof BuildConfigurationKey;
   }
 
   private static boolean fullAnalysisInvalidatingPredicateWithActions(SkyKey key) {
     return basicAnalysisInvalidatingPredicateWithActions(key)
-        || key instanceof BuildConfigurationValue.Key;
+        || key instanceof BuildConfigurationKey;
   }
 
   private WorkspaceStatusAction makeWorkspaceStatusAction(String workspaceName) {
@@ -1538,14 +1540,14 @@
       configuredTargetProgress.reset();
     }
 
-    ImmutableList<BuildConfiguration> topLevelTargetConfigs =
+    ImmutableList<BuildConfigurationValue> topLevelTargetConfigs =
         getConfigurations(
             eventHandler,
             PrepareAnalysisPhaseFunction.getTopLevelBuildOptions(buildOptions, multiCpu),
             buildOptions,
             keepGoing);
 
-    BuildConfiguration firstTargetConfig = topLevelTargetConfigs.get(0);
+    BuildConfigurationValue firstTargetConfig = topLevelTargetConfigs.get(0);
 
     BuildOptions targetOptions = firstTargetConfig.getOptions();
     BuildOptionsView hostTransitionOptionsView =
@@ -1555,7 +1557,7 @@
         targetOptions.get(CoreOptions.class).useDistinctHostConfiguration
             ? HostTransition.INSTANCE.patch(hostTransitionOptionsView, eventHandler)
             : targetOptions;
-    BuildConfiguration hostConfig = getConfiguration(eventHandler, hostOptions, keepGoing);
+    BuildConfigurationValue hostConfig = getConfiguration(eventHandler, hostOptions, keepGoing);
 
     // TODO(gregce): cache invalid option errors in BuildConfigurationFunction, then use a dedicated
     // accessor (i.e. not the event handler) to trigger the exception below.
@@ -1759,7 +1761,7 @@
   @ThreadSafety.ThreadSafe
   public ImmutableList<ConfiguredTargetAndData> getConfiguredTargetsForTesting(
       ExtendedEventHandler eventHandler,
-      BuildConfiguration originalConfig,
+      BuildConfigurationValue originalConfig,
       Iterable<DependencyKey> keys)
       throws TransitionException, InvalidConfigurationException, InterruptedException {
     return getConfiguredTargetMapForTesting(eventHandler, originalConfig, keys).values().asList();
@@ -1777,7 +1779,7 @@
   @ThreadSafety.ThreadSafe
   public ImmutableMultimap<DependencyKey, ConfiguredTargetAndData> getConfiguredTargetMapForTesting(
       ExtendedEventHandler eventHandler,
-      BuildConfigurationValue.Key originalConfig,
+      BuildConfigurationKey originalConfig,
       Iterable<DependencyKey> keys)
       throws InvalidConfigurationException, InterruptedException {
     return getConfiguredTargetMapForTesting(
@@ -1797,12 +1799,12 @@
   private ImmutableMultimap<DependencyKey, ConfiguredTargetAndData>
       getConfiguredTargetMapForTesting(
           ExtendedEventHandler eventHandler,
-          BuildConfiguration originalConfig,
+          BuildConfigurationValue originalConfig,
           Iterable<DependencyKey> keys)
           throws InvalidConfigurationException, InterruptedException {
     checkActive();
 
-    Multimap<DependencyKey, BuildConfiguration> configs;
+    Multimap<DependencyKey, BuildConfigurationValue> configs;
     if (originalConfig != null) {
       configs =
           getConfigurations(eventHandler, originalConfig.getOptions(), keys).getConfigurationMap();
@@ -1820,7 +1822,7 @@
         // it couldn't be loaded). Exclude it from the results.
         continue;
       }
-      for (BuildConfiguration depConfig : configs.get(key)) {
+      for (BuildConfigurationValue depConfig : configs.get(key)) {
         skyKeys.add(
             ConfiguredTargetKey.builder()
                 .setLabel(key.getLabel())
@@ -1853,7 +1855,7 @@
           // it couldn't be loaded). Exclude it from the results.
           continue;
         }
-        for (BuildConfiguration depConfig : configs.get(key)) {
+        for (BuildConfigurationValue depConfig : configs.get(key)) {
           SkyKey configuredTargetKey =
               ConfiguredTargetKey.builder()
                   .setLabel(key.getLabel())
@@ -1896,13 +1898,13 @@
           try {
             ConfiguredTarget mergedTarget =
                 MergedConfiguredTarget.of(configuredTarget, configuredAspects);
-            BuildConfigurationValue.Key configKey = mergedTarget.getConfigurationKey();
-            BuildConfiguration resolvedConfig = depConfig;
+            BuildConfigurationKey configKey = mergedTarget.getConfigurationKey();
+            BuildConfigurationValue resolvedConfig = depConfig;
             if (configKey == null) {
               // Unfortunately, it's possible to get a configured target with a null configuration
               // when depConfig is non-null, so we need to explicitly override it in that case.
               resolvedConfig = null;
-            } else if (!configKey.equals(BuildConfigurationValue.key(depConfig))) {
+            } else if (!configKey.equals(depConfig.getKey())) {
               resolvedConfig = getConfiguration(eventHandler, mergedTarget.getConfigurationKey());
             }
             cts.put(
@@ -1924,12 +1926,10 @@
       aliasPackageValues = evaluateSkyKeys(eventHandler, aliasPackagesToFetch);
       keysToProcess = aliasKeysToRedo;
     }
-    Supplier<Map<BuildConfigurationValue.Key, BuildConfiguration>> configurationLookupSupplier =
+    Supplier<Map<BuildConfigurationKey, BuildConfigurationValue>> configurationLookupSupplier =
         () ->
             configs.values().stream()
-                .collect(
-                    Collectors.toMap(
-                        BuildConfigurationValue::key, java.util.function.Function.identity()));
+                .collect(toMap(BuildConfigurationValue::getKey, Functions.identity()));
     // We ignore the return value here because tests effectively run with --keep_going, and the
     // loading-phase-error bit is only needed if we're constructing a SkyframeAnalysisResult.
     SkyframeBuildView.processErrors(
@@ -1949,31 +1949,29 @@
    * @throws InvalidConfigurationException if the build options produces an invalid configuration
    */
   @Deprecated
-  public BuildConfiguration getConfiguration(
+  public BuildConfigurationValue getConfiguration(
       ExtendedEventHandler eventHandler, BuildOptions options, boolean keepGoing)
       throws InvalidConfigurationException {
     return Iterables.getOnlyElement(
         getConfigurations(eventHandler, ImmutableList.of(options), options, keepGoing));
   }
 
-  public BuildConfiguration getConfiguration(
-      ExtendedEventHandler eventHandler, BuildConfigurationValue.Key configurationKey) {
+  public BuildConfigurationValue getConfiguration(
+      ExtendedEventHandler eventHandler, BuildConfigurationKey configurationKey) {
     if (configurationKey == null) {
       return null;
     }
-    return ((BuildConfigurationValue)
-            evaluateSkyKeys(eventHandler, ImmutableList.of(configurationKey)).get(configurationKey))
-        .getConfiguration();
+    return (BuildConfigurationValue)
+        evaluateSkyKeys(eventHandler, ImmutableList.of(configurationKey)).get(configurationKey);
   }
 
-  public Map<BuildConfigurationValue.Key, BuildConfiguration> getConfigurations(
-      ExtendedEventHandler eventHandler, Collection<BuildConfigurationValue.Key> keys) {
+  public Map<BuildConfigurationKey, BuildConfigurationValue> getConfigurations(
+      ExtendedEventHandler eventHandler, Collection<BuildConfigurationKey> keys) {
     EvaluationResult<SkyValue> evaluationResult = evaluateSkyKeys(eventHandler, keys);
     return keys.stream()
         .collect(
-            Collectors.toMap(
-                java.util.function.Function.identity(),
-                (key) -> ((BuildConfigurationValue) evaluationResult.get(key)).getConfiguration()));
+            toMap(
+                Functions.identity(), key -> (BuildConfigurationValue) evaluationResult.get(key)));
   }
   /**
    * Returns the configurations corresponding to the given sets of build options. Output order is
@@ -1982,7 +1980,7 @@
    * @throws InvalidConfigurationException if any build options produces an invalid configuration
    */
   // TODO(ulfjack): Remove this legacy method after switching to the Skyframe-based implementation.
-  private ImmutableList<BuildConfiguration> getConfigurations(
+  private ImmutableList<BuildConfigurationValue> getConfigurations(
       ExtendedEventHandler eventHandler,
       List<BuildOptions> optionsList,
       BuildOptions referenceBuildOptions,
@@ -2028,8 +2026,8 @@
 
     // Prepare and return the results.
     return configSkyKeys.stream()
-        .map(key -> ((BuildConfigurationValue) evalResult.get(key)).getConfiguration())
-        .collect(ImmutableList.toImmutableList());
+        .map(key -> (BuildConfigurationValue) evalResult.get(key))
+        .collect(toImmutableList());
   }
 
   /**
@@ -2096,12 +2094,12 @@
       }
 
       for (BuildOptions toOption : toOptions) {
-        BuildConfigurationValue.Key configKey =
+        BuildConfigurationKey configKey =
             toConfigurationKey(platformMappingValue, allFragments, toOption);
         BuildConfigurationValue configValue =
             (BuildConfigurationValue) configsResult.get(configKey);
         if (configValue != null) {
-          builder.put(key, configValue.getConfiguration());
+          builder.put(key, configValue);
         } else if (configsResult.errorMap().containsKey(configKey)) {
           ErrorInfo configError = configsResult.getError(configKey);
           if (configError.getException() instanceof InvalidConfigurationException) {
@@ -2117,11 +2115,11 @@
     return builder.build();
   }
 
-  /** Returns every {@link BuildConfigurationValue.Key} in the graph. */
+  /** Returns every {@link BuildConfigurationKey} in the graph. */
   public Collection<SkyKey> getTransitiveConfigurationKeys() {
     return memoizingEvaluator.getDoneValues().keySet().stream()
         .filter(key -> SkyFunctions.BUILD_CONFIGURATION.equals(key.functionName()))
-        .collect(ImmutableList.toImmutableList());
+        .collect(toImmutableList());
   }
 
   private PlatformMappingValue getPlatformMappingValue(
@@ -2141,13 +2139,13 @@
     return (PlatformMappingValue) evaluationResult.get(platformMappingKey);
   }
 
-  private static BuildConfigurationValue.Key toConfigurationKey(
+  private static BuildConfigurationKey toConfigurationKey(
       PlatformMappingValue platformMappingValue,
       FragmentClassSet depFragments,
       BuildOptions toOption)
       throws InvalidConfigurationException {
     try {
-      return BuildConfigurationValue.keyWithPlatformMapping(
+      return BuildConfigurationKey.withPlatformMapping(
           platformMappingValue, depFragments, toOption);
     } catch (OptionsParsingException e) {
       throw new InvalidConfigurationException(Code.INVALID_BUILD_OPTIONS, e);
@@ -2241,28 +2239,26 @@
    * options.
    */
   @VisibleForTesting
-  public BuildConfiguration getConfigurationForTesting(
+  public BuildConfigurationValue getConfigurationForTesting(
       ExtendedEventHandler eventHandler, FragmentClassSet fragments, BuildOptions options)
       throws InterruptedException, OptionsParsingException, InvalidConfigurationException {
     SkyKey key =
-        BuildConfigurationValue.keyWithPlatformMapping(
+        BuildConfigurationKey.withPlatformMapping(
             getPlatformMappingValue(eventHandler, options), fragments, options);
-    BuildConfigurationValue result =
-        (BuildConfigurationValue)
-            evaluate(
-                    ImmutableList.of(key),
-                    /*keepGoing=*/ false,
-                    /*numThreads=*/ DEFAULT_THREAD_COUNT,
-                    eventHandler)
-                .get(key);
-    return result.getConfiguration();
+    return (BuildConfigurationValue)
+        evaluate(
+                ImmutableList.of(key),
+                /*keepGoing=*/ false,
+                /*numThreads=*/ DEFAULT_THREAD_COUNT,
+                eventHandler)
+            .get(key);
   }
 
   /** Returns a particular configured target. */
   @VisibleForTesting
   @Nullable
   public ConfiguredTarget getConfiguredTargetForTesting(
-      ExtendedEventHandler eventHandler, Label label, BuildConfiguration configuration)
+      ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue configuration)
       throws TransitionException, InvalidConfigurationException, InterruptedException {
     return getConfiguredTargetForTesting(eventHandler, label, configuration, NoTransition.INSTANCE);
   }
@@ -2273,7 +2269,7 @@
   public ConfiguredTarget getConfiguredTargetForTesting(
       ExtendedEventHandler eventHandler,
       Label label,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       ConfigurationTransition transition)
       throws TransitionException, InvalidConfigurationException, InterruptedException {
     ConfiguredTargetAndData configuredTargetAndData =
@@ -2286,7 +2282,7 @@
   public ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
       ExtendedEventHandler eventHandler,
       Label label,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       ConfigurationTransition transition)
       throws TransitionException, InvalidConfigurationException, InterruptedException {
 
@@ -2303,7 +2299,7 @@
   @VisibleForTesting
   @Nullable
   public ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
-      ExtendedEventHandler eventHandler, Label label, BuildConfiguration configuration)
+      ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue configuration)
       throws TransitionException, InvalidConfigurationException, InterruptedException {
     return getConfiguredTargetAndDataForTesting(
         eventHandler, label, configuration, NoTransition.INSTANCE);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java
index 3033a02..786b3bd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java
@@ -42,7 +42,7 @@
     return SkyFunctions.TOOLCHAIN_RESOLUTION;
   }
 
-  abstract BuildConfigurationValue.Key configurationKey();
+  abstract BuildConfigurationKey configurationKey();
 
   abstract ImmutableSet<Label> requiredToolchainTypeLabels();
 
@@ -55,7 +55,7 @@
   /** Builder for {@link ToolchainContextKey}. */
   @AutoValue.Builder
   public interface Builder {
-    Builder configurationKey(BuildConfigurationValue.Key key);
+    Builder configurationKey(BuildConfigurationKey key);
 
     Builder requiredToolchainTypeLabels(ImmutableSet<Label> requiredToolchainTypeLabels);
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
index f579293..a8390ec 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
@@ -27,7 +27,7 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Table;
 import com.google.devtools.build.lib.analysis.PlatformConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
 import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
@@ -70,12 +70,11 @@
           UnloadedToolchainContextImpl.builder().setKey(key);
 
       // Determine the configuration being used.
-      BuildConfigurationValue value =
+      BuildConfigurationValue configuration =
           (BuildConfigurationValue) env.getValue(key.configurationKey());
-      if (value == null) {
+      if (configuration == null) {
         throw new ValueMissingException();
       }
-      BuildConfiguration configuration = value.getConfiguration();
       PlatformConfiguration platformConfiguration =
           Preconditions.checkNotNull(configuration.getFragment(PlatformConfiguration.class));
 
@@ -149,7 +148,7 @@
   /** Returns a map from the requested toolchain type to the {@link ToolchainTypeInfo} provider. */
   private static ImmutableMap<Label, ToolchainTypeInfo> loadToolchainTypes(
       Environment environment,
-      BuildConfiguration configuration,
+      BuildConfigurationValue configuration,
       ImmutableSet<Label> requestedToolchainTypeLabels)
       throws InvalidToolchainTypeException, InterruptedException, ValueMissingException {
     ImmutableSet<ConfiguredTargetKey> toolchainTypeKeys =
@@ -208,8 +207,8 @@
   private static PlatformKeys loadPlatformKeys(
       SkyFunction.Environment environment,
       boolean debug,
-      BuildConfigurationValue.Key configurationKey,
-      BuildConfiguration configuration,
+      BuildConfigurationKey configurationKey,
+      BuildConfigurationValue configuration,
       PlatformConfiguration platformConfiguration,
       ImmutableSet<Label> execConstraintLabels)
       throws InterruptedException, ValueMissingException, InvalidConstraintValueException,
@@ -251,8 +250,8 @@
   private static ImmutableList<ConfiguredTargetKey> loadExecutionPlatformKeys(
       SkyFunction.Environment environment,
       boolean debug,
-      BuildConfigurationValue.Key configurationKey,
-      BuildConfiguration configuration,
+      BuildConfigurationKey configurationKey,
+      BuildConfigurationValue configuration,
       ConfiguredTargetKey defaultPlatformKey,
       ImmutableSet<Label> execConstraintLabels)
       throws InterruptedException, ValueMissingException, InvalidConstraintValueException,
@@ -352,7 +351,7 @@
 
   private static void determineToolchainImplementations(
       Environment environment,
-      BuildConfigurationValue.Key configurationKey,
+      BuildConfigurationKey configurationKey,
       ImmutableSet<Label> requiredToolchainTypeLabels,
       Optional<ConfiguredTargetKey> forcedExecutionPlatform,
       UnloadedToolchainContextImpl.Builder builder,
@@ -428,7 +427,7 @@
             platformKeys.executionPlatformKeys(),
             resolvedToolchains);
 
-    if (!selectedExecutionPlatformKey.isPresent()) {
+    if (selectedExecutionPlatformKey.isEmpty()) {
       throw new NoMatchingPlatformException(
           requiredToolchainTypeLabels,
           platformKeys.executionPlatformKeys(),