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 9b67fe8..f548b18 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
@@ -26,11 +26,13 @@
 /**
  * A dependency of a configured target through a label.
  *
- * <p>For static configurations: includes the target and the configuration of the dependency
+ * <p>The dep's configuration can be specified in one of two ways:
+ *
+ * <p>Explicit configurations: includes the target and the configuration of the dependency
  * configured target and any aspects that may be required, as well as the configurations for
  * these aspects.
  *
- * <p>For dynamic configurations: includes the target and the desired configuration transitions
+ * <p>Configuration transitions: includes the target and the desired configuration transitions
  * that should be applied to produce the dependency's configuration. It's the caller's
  * responsibility to construct an actual configuration out of that. A set of aspects is also
  * included; the caller must also construct configurations for each of these.
@@ -45,30 +47,29 @@
 
   /**
    * Creates a new {@link Dependency} with a null configuration, suitable for edges with no
-   * configuration in static configuration builds.
+   * configuration.
    */
   public static Dependency withNullConfiguration(Label label) {
     return new NullConfigurationDependency(label);
   }
 
   /**
-   * Creates a new {@link Dependency} with the given configuration, suitable for static
-   * configuration builds.
+   * Creates a new {@link Dependency} with the given explicit configuration.
    *
    * <p>The configuration must not be {@code null}.
    *
    * <p>A {@link Dependency} created this way will have no associated aspects.
    */
   public static Dependency withConfiguration(Label label, BuildConfiguration configuration) {
-    return new StaticConfigurationDependency(
+    return new ExplicitConfigurationDependency(
         label, configuration,
         AspectCollection.EMPTY,
         ImmutableMap.<AspectDescriptor, BuildConfiguration>of());
   }
 
   /**
-   * Creates a new {@link Dependency} with the given configuration and aspects, suitable for
-   * static configuration builds. The configuration is also applied to all aspects.
+   * Creates a new {@link Dependency} with the given configuration and aspects. The configuration
+   * is also applied to all aspects.
    *
    * <p>The configuration and aspects must not be {@code null}.
    */
@@ -79,12 +80,13 @@
     for (AspectDescriptor aspect : aspects.getAllAspects()) {
       aspectBuilder.put(aspect, configuration);
     }
-    return new StaticConfigurationDependency(label, configuration, aspects, aspectBuilder.build());
+    return new ExplicitConfigurationDependency(label, configuration, aspects,
+        aspectBuilder.build());
   }
 
   /**
    * Creates a new {@link Dependency} with the given configuration and aspects, suitable for
-   * storing the output of a dynamic configuration trimming step. The aspects each have their own
+   * storing the output of a configuration trimming step. The aspects each have their own
    * configuration.
    *
    * <p>The aspects and configurations must not be {@code null}.
@@ -93,17 +95,16 @@
       Label label, BuildConfiguration configuration,
       AspectCollection aspects,
       Map<AspectDescriptor, BuildConfiguration> aspectConfigurations) {
-    return new StaticConfigurationDependency(
+    return new ExplicitConfigurationDependency(
         label, configuration, aspects, ImmutableMap.copyOf(aspectConfigurations));
   }
 
   /**
-   * Creates a new {@link Dependency} with the given transition and aspects, suitable for dynamic
-   * configuration builds.
+   * Creates a new {@link Dependency} with the given transition and aspects.
    */
   public static Dependency withTransitionAndAspects(
       Label label, Attribute.Transition transition, AspectCollection aspects) {
-    return new DynamicConfigurationDependency(label, transition, aspects);
+    return new ConfigurationTransitionDependency(label, transition, aspects);
   }
 
   protected final Label label;
@@ -122,23 +123,23 @@
   }
 
   /**
-   * Returns true if this dependency specifies a static configuration, false if it specifies
-   * a dynamic transition.
+   * Returns true if this dependency specifies an explicit configuration, false if it specifies
+   * a configuration transition.
    */
-  public abstract boolean hasStaticConfiguration();
+  public abstract boolean hasExplicitConfiguration();
 
   /**
-   * Returns the static configuration for the target this dependency points to.
+   * Returns the explicit configuration intended for this dependency.
    *
-   * @throws IllegalStateException if {@link #hasStaticConfiguration} returns false.
+   * @throws IllegalStateException if {@link #hasExplicitConfiguration} returns false.
    */
   @Nullable
   public abstract BuildConfiguration getConfiguration();
 
   /**
-   * Returns the dynamic transition to be applied to reach the target this dependency points to.
+   * Returns the configuration transition to apply to reach the target this dependency points to.
    *
-   * @throws IllegalStateException if {@link #hasStaticConfiguration} returns true.
+   * @throws IllegalStateException if {@link #hasExplicitConfiguration} returns true.
    */
   public abstract Attribute.Transition getTransition();
 
@@ -151,15 +152,15 @@
   public abstract AspectCollection getAspects();
 
   /**
-   * Returns the the static configuration an aspect should be evaluated with
+   * Returns the configuration an aspect should be evaluated with
    **
-   * @throws IllegalStateException if {@link #hasStaticConfiguration()} returns false.
+   * @throws IllegalStateException if {@link #hasExplicitConfiguration()} returns false.
    */
   public abstract BuildConfiguration getAspectConfiguration(AspectDescriptor aspect);
 
   /**
-   * Implementation of a dependency with no configuration, suitable for static configuration
-   * builds of edges to source files or e.g. for visibility.
+   * Implementation of a dependency with no configuration, suitable for, e.g., source files or
+   * visibility.
    */
   private static final class NullConfigurationDependency extends Dependency {
     public NullConfigurationDependency(Label label) {
@@ -167,7 +168,7 @@
     }
 
     @Override
-    public boolean hasStaticConfiguration() {
+    public boolean hasExplicitConfiguration() {
       return true;
     }
 
@@ -180,7 +181,7 @@
     @Override
     public Attribute.Transition getTransition() {
       throw new IllegalStateException(
-          "A dependency with a static configuration does not have a transition.");
+          "This dependency has an explicit configuration, not a transition.");
     }
 
     @Override
@@ -214,15 +215,14 @@
   }
 
   /**
-   * Implementation of a dependency with static configurations, suitable for static configuration
-   * builds.
+   * Implementation of a dependency with an explicitly set configuration.
    */
-  private static final class StaticConfigurationDependency extends Dependency {
+  private static final class ExplicitConfigurationDependency extends Dependency {
     private final BuildConfiguration configuration;
     private final AspectCollection aspects;
     private final ImmutableMap<AspectDescriptor, BuildConfiguration> aspectConfigurations;
 
-    public StaticConfigurationDependency(
+    public ExplicitConfigurationDependency(
         Label label, BuildConfiguration configuration,
         AspectCollection aspects,
         ImmutableMap<AspectDescriptor, BuildConfiguration> aspectConfigurations) {
@@ -233,7 +233,7 @@
     }
 
     @Override
-    public boolean hasStaticConfiguration() {
+    public boolean hasExplicitConfiguration() {
       return true;
     }
 
@@ -245,7 +245,7 @@
     @Override
     public Attribute.Transition getTransition() {
       throw new IllegalStateException(
-          "A dependency with a static configuration does not have a transition.");
+          "This dependency has an explicit configuration, not a transition.");
     }
 
     @Override
@@ -265,10 +265,10 @@
 
     @Override
     public boolean equals(Object other) {
-      if (!(other instanceof StaticConfigurationDependency)) {
+      if (!(other instanceof ExplicitConfigurationDependency)) {
         return false;
       }
-      StaticConfigurationDependency otherDep = (StaticConfigurationDependency) other;
+      ExplicitConfigurationDependency otherDep = (ExplicitConfigurationDependency) other;
       return label.equals(otherDep.label)
           && configuration.equals(otherDep.configuration)
           && aspects.equals(otherDep.aspects)
@@ -278,20 +278,19 @@
     @Override
     public String toString() {
       return String.format(
-          "StaticConfigurationDependency{label=%s, configuration=%s, aspectConfigurations=%s}",
-          label, configuration, aspectConfigurations);
+          "%s{label=%s, configuration=%s, aspectConfigurations=%s}",
+          getClass().getSimpleName(), label, configuration, aspectConfigurations);
     }
   }
 
   /**
-   * Implementation of a dependency with a given configuration transition, suitable for dynamic
-   * configuration builds.
+   * Implementation of a dependency with a given configuration transition.
    */
-  private static final class DynamicConfigurationDependency extends Dependency {
+  private static final class ConfigurationTransitionDependency extends Dependency {
     private final Attribute.Transition transition;
     private final AspectCollection aspects;
 
-    public DynamicConfigurationDependency(
+    public ConfigurationTransitionDependency(
         Label label, Attribute.Transition transition, AspectCollection aspects) {
       super(label);
       this.transition = Preconditions.checkNotNull(transition);
@@ -299,14 +298,14 @@
     }
 
     @Override
-    public boolean hasStaticConfiguration() {
+    public boolean hasExplicitConfiguration() {
       return false;
     }
 
     @Override
     public BuildConfiguration getConfiguration() {
       throw new IllegalStateException(
-          "A dependency with a dynamic configuration transition does not have a configuration.");
+          "This dependency has a transition, not an explicit configuration.");
     }
 
     @Override
@@ -322,8 +321,7 @@
     @Override
     public BuildConfiguration getAspectConfiguration(AspectDescriptor aspect) {
       throw new IllegalStateException(
-          "A dependency with a dynamic configuration transition does not have aspect "
-              + "configurations.");
+          "This dependency has a transition, not an explicit aspect configuration.");
     }
 
     @Override
@@ -333,10 +331,10 @@
 
     @Override
     public boolean equals(Object other) {
-      if (!(other instanceof DynamicConfigurationDependency)) {
+      if (!(other instanceof ConfigurationTransitionDependency)) {
         return false;
       }
-      DynamicConfigurationDependency otherDep = (DynamicConfigurationDependency) other;
+      ConfigurationTransitionDependency otherDep = (ConfigurationTransitionDependency) other;
       return label.equals(otherDep.label)
           && transition.equals(otherDep.transition)
           && aspects.equals(otherDep.aspects);
@@ -345,8 +343,8 @@
     @Override
     public String toString() {
       return String.format(
-          "DynamicConfigurationDependency{label=%s, transition=%s, aspects=%s}",
-          label, transition, aspects);
+          "%s{label=%s, transition=%s, aspects=%s}",
+          getClass().getSimpleName(), label, transition, aspects);
     }
   }
 }
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 ce8405b..7b3f725 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
@@ -255,8 +255,8 @@
 
     // When getting the dependencies of this hybrid aspect+base target, use the aspect's
     // configuration. The configuration of the aspect will always be a superset of the target's
-    // (dynamic configuration mode: target is part of the aspect's config fragment requirements;
-    // static configuration mode: target is the same configuration as the aspect), so the fragments
+    // (trimmed configuration mode: target is part of the aspect's config fragment requirements;
+    // untrimmed mode: target is the same configuration as the aspect), so the fragments
     // required by all dependencies (both those of the aspect and those of the base target)
     // will be present this way.
     TargetAndConfiguration originalTargetAndAspectConfiguration =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
index 0656d45..ee23308 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
@@ -112,7 +112,7 @@
     /**
      * Returns the configuration to be used for the evaluation of the aspect itself.
      *
-     * <p>In dynamic configuration mode, the aspect may require more fragments than the target on
+     * <p>In trimmed configuration mode, the aspect may require more fragments than the target on
      * which it is being evaluated; in addition to configuration fragments required by the target
      * and its dependencies, an aspect has configuration fragment requirements of its own, as well
      * as dependencies of its own with their own configuration fragment requirements.
@@ -122,7 +122,7 @@
      * configurations trimmed from this one as normal.
      *
      * <p>Because of these properties, this configuration is always a superset of that returned by
-     * {@link #getBaseConfiguration()}. In static configuration mode, this configuration will be
+     * {@link #getBaseConfiguration()}. In untrimmed configuration mode, this configuration will be
      * equivalent to that returned by {@link #getBaseConfiguration()}.
      *
      * @see #getBaseConfiguration()
@@ -134,7 +134,7 @@
     /**
      * Returns the configuration to be used for the base target.
      *
-     * <p>In dynamic configuration mode, the configured target this aspect is attached to may have
+     * <p>In trimmed configuration mode, the configured target this aspect is attached to may have
      * a different configuration than the aspect itself (see the documentation for
      * {@link #getAspectConfiguration()} for an explanation why). The base configuration is the one
      * used to construct a key to look up the base configured target.
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 2b18dc8..ce60f42 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
@@ -531,7 +531,7 @@
    * Creates a dynamic configuration for each dep that's custom-fitted specifically for that dep.
    *
    * <p>More specifically: given a set of {@link Dependency} instances holding dynamic config
-   * transition requests (e.g. {@link Dependency#hasStaticConfiguration()} == false}), returns
+   * transition requests (e.g. {@link Dependency#hasExplicitConfiguration()} == false}), returns
    * equivalent dependencies containing dynamically created configurations applying those
    * transitions. If {@link BuildConfiguration.Options#trimConfigurations()} is true, these
    * configurations only contain the fragments needed by the dep and its transitive closure. Else
@@ -618,7 +618,7 @@
       //
       // A *lot* of targets have null deps, so this produces real savings. Profiling tests over a
       // simple cc_binary show this saves ~1% of total analysis phase time.
-      if (dep.hasStaticConfiguration()) {
+      if (dep.hasExplicitConfiguration()) {
         continue;
       }
 
@@ -869,7 +869,7 @@
     OrderedSetMultimap<Attribute, Dependency> result = OrderedSetMultimap.create();
     for (Map.Entry<Attribute, Dependency> depsEntry : originalDeps.entries()) {
       AttributeAndLabel attrAndLabel = iterator.next();
-      if (depsEntry.getValue().hasStaticConfiguration()) {
+      if (depsEntry.getValue().hasExplicitConfiguration()) {
         result.put(attrAndLabel.attribute, depsEntry.getValue());
       } else {
         Collection<Dependency> dynamicAttrDeps = dynamicDeps.get(attrAndLabel);
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 6a472b7..fb18457 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
@@ -505,8 +505,6 @@
    * Returns the host configuration trimmed to the same fragments as the input configuration. If
    * the input is null, returns the top-level host configuration.
    *
-   * <p>For static configurations, this unconditionally returns the (sole) top-level configuration.
-   *
    * <p>This may only be called after {@link #setTopLevelHostConfiguration} has set the
    * correct host configuration at the top-level.
    */
@@ -531,7 +529,7 @@
     Set<Class<? extends BuildConfiguration.Fragment>> fragmentClasses =
         config.trimConfigurations()
             ? config.fragmentClasses()
-            : ((ConfiguredRuleClassProvider) ruleClassProvider).getAllFragments();
+            : ruleClassProvider.getAllFragments();
     BuildConfiguration hostConfig = hostConfigurationCache.get(fragmentClasses);
     if (hostConfig != null) {
       return hostConfig;
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 8ddecaf..fafe911 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
@@ -1435,7 +1435,7 @@
     Map<Label, Set<Class<? extends BuildConfiguration.Fragment>>> fragmentsMap = new HashMap<>();
     Set<Label> labelsWithErrors = new HashSet<>();
     for (Dependency key : keys) {
-      if (key.hasStaticConfiguration()) {
+      if (key.hasExplicitConfiguration()) {
         builder.put(key, key.getConfiguration());
       } else if (useUntrimmedDynamicConfigs(fromOptions)) {
         fragmentsMap.put(key.getLabel(), allFragments);
@@ -1464,7 +1464,7 @@
     // Now get the configurations.
     final List<SkyKey> configSkyKeys = new ArrayList<>();
     for (Dependency key : keys) {
-      if (labelsWithErrors.contains(key.getLabel()) || key.hasStaticConfiguration()) {
+      if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) {
         continue;
       }
       Set<Class<? extends BuildConfiguration.Fragment>> depFragments =
@@ -1479,7 +1479,7 @@
     EvaluationResult<SkyValue> configsResult =
         evaluateSkyKeys(eventHandler, configSkyKeys, /*keepGoing=*/true);
     for (Dependency key : keys) {
-      if (labelsWithErrors.contains(key.getLabel()) || key.hasStaticConfiguration()) {
+      if (labelsWithErrors.contains(key.getLabel()) || key.hasExplicitConfiguration()) {
         continue;
       }
       Set<Class<? extends BuildConfiguration.Fragment>> depFragments =
