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 d3c2139..c16e95d 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
@@ -1087,7 +1087,7 @@
     if (getToolchainContext() == null) {
       return null;
     }
-    return getToolchainContext().getExecutionPlatform();
+    return getToolchainContext().executionPlatform();
   }
 
   private void checkAttribute(String attributeName, Mode mode) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
index a23dccd..dea3985 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
@@ -34,20 +34,18 @@
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skylarkbuildapi.ToolchainContextApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.EvalUtils;
-import com.google.devtools.build.lib.syntax.SkylarkIndexable;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.StreamSupport;
-import javax.annotation.Nullable;
 
 /** Contains toolchain-related information needed for a {@link RuleContext}. */
 @Immutable
 @ThreadSafe
 public class ToolchainContext implements ToolchainContextApi {
+
   public static ToolchainContext create(
       String targetDescription,
       PlatformInfo executionPlatform,
@@ -78,7 +76,7 @@
   private final ResolvedToolchainLabels resolvedToolchainLabels;
 
   /** Stores the actual ToolchainInfo provider for each toolchain type. */
-  private ResolvedToolchainProviders resolvedToolchainProviders;
+  private ImmutableMap<Label, ToolchainInfo> toolchainProviders;
 
   private ToolchainContext(
       String targetDescription,
@@ -91,36 +89,29 @@
     this.targetPlatform = targetPlatform;
     this.requiredToolchains = ImmutableList.copyOf(requiredToolchains);
     this.resolvedToolchainLabels = resolvedToolchainLabels;
-    this.resolvedToolchainProviders =
-        new ResolvedToolchainProviders(ImmutableMap.<Label, ToolchainInfo>of());
+    this.toolchainProviders = ImmutableMap.of();
   }
 
-  public PlatformInfo getExecutionPlatform() {
+  public PlatformInfo executionPlatform() {
     return executionPlatform;
   }
 
-  public PlatformInfo getTargetPlatform() {
+  public PlatformInfo targetPlatform() {
     return targetPlatform;
   }
 
-  public ImmutableList<Label> getRequiredToolchains() {
+  public ImmutableList<Label> requiredToolchainTypes() {
     return requiredToolchains;
   }
 
   public void resolveToolchains(
       OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap) {
     if (!this.requiredToolchains.isEmpty()) {
-      this.resolvedToolchainProviders =
-          new ResolvedToolchainProviders(findToolchains(resolvedToolchainLabels, prerequisiteMap));
+      this.toolchainProviders = findToolchains(resolvedToolchainLabels, prerequisiteMap);
     }
   }
 
-  @Nullable
-  public SkylarkIndexable getResolvedToolchainProviders() {
-    return resolvedToolchainProviders;
-  }
-
-  public ImmutableSet<Label> getResolvedToolchainLabels() {
+  public ImmutableSet<Label> resolvedToolchainLabels() {
     return resolvedToolchainLabels.getToolchainLabels();
   }
 
@@ -133,6 +124,7 @@
 
   /** Tracks the mapping from toolchain type label to the label of the actual resolved toolchain. */
   private static class ResolvedToolchainLabels {
+
     private final ImmutableBiMap<Label, Label> toolchainLabels;
 
     private ResolvedToolchainLabels(ImmutableBiMap<Label, Label> toolchainLabels) {
@@ -185,80 +177,71 @@
     return toolchains.build();
   }
 
-  /** Tracks the mapping from toolchain type label to {@link ToolchainInfo} provider. */
-  public class ResolvedToolchainProviders implements SkylarkValue, SkylarkIndexable {
+  // Implement SkylarkValue and SkylarkIndexable.
 
-    private final ImmutableMap<Label, ToolchainInfo> toolchains;
+  @Override
+  public boolean isImmutable() {
+    return true;
+  }
 
-    private ResolvedToolchainProviders(ImmutableMap<Label, ToolchainInfo> toolchains) {
-      this.toolchains = toolchains;
-    }
+  @Override
+  public void repr(SkylarkPrinter printer) {
+    printer.append("<toolchain_context.resolved_labels: ");
+    printer.append(
+        toolchainProviders.keySet().stream().map(key -> key.toString()).collect(joining(", ")));
+    printer.append(">");
+  }
 
-    @Override
-    public boolean isImmutable() {
-      return true;
-    }
-
-    @Override
-    public void repr(SkylarkPrinter printer) {
-      printer.append("<toolchain_context.resolved_labels: ");
-      printer.append(toolchains.keySet().stream()
-          .map(key -> key.toString())
-          .collect(joining(", ")));
-      printer.append(">");
-    }
-
-    private Label transformKey(Object key, Location loc) throws EvalException {
-      if (key instanceof Label) {
-        Label toolchainType = (Label) key;
-        return toolchainType;
-      } else if (key instanceof String) {
-        Label toolchainType = null;
-        String rawLabel = (String) key;
-        try {
-          toolchainType = Label.parseAbsolute(rawLabel);
-        } catch (LabelSyntaxException e) {
-          throw new EvalException(
-              loc, String.format("Unable to parse toolchain %s: %s", rawLabel, e.getMessage()), e);
-        }
-        return toolchainType;
-      } else {
+  private Label transformKey(Object key, Location loc) throws EvalException {
+    if (key instanceof Label) {
+      Label toolchainType = (Label) key;
+      return toolchainType;
+    } else if (key instanceof String) {
+      Label toolchainType = null;
+      String rawLabel = (String) key;
+      try {
+        toolchainType = Label.parseAbsolute(rawLabel);
+      } catch (LabelSyntaxException e) {
         throw new EvalException(
-            loc,
-            String.format(
-                "Toolchains only supports indexing by toolchain type, got %s instead",
-                EvalUtils.getDataTypeName(key)));
+            loc, String.format("Unable to parse toolchain %s: %s", rawLabel, e.getMessage()), e);
       }
+      return toolchainType;
+    } else {
+      throw new EvalException(
+          loc,
+          String.format(
+              "Toolchains only supports indexing by toolchain type, got %s instead",
+              EvalUtils.getDataTypeName(key)));
     }
+  }
 
-    @Override
-    public ToolchainInfo getIndex(Object key, Location loc) throws EvalException {
-      Label toolchainType = transformKey(key, loc);
+  @Override
+  public ToolchainInfo getIndex(Object key, Location loc) throws EvalException {
+    Label toolchainType = transformKey(key, loc);
 
-      if (!requiredToolchains.contains(toolchainType)) {
-        throw new EvalException(
-            loc,
-            String.format(
-                "In %s, toolchain type %s was requested but only types [%s] are configured",
-                targetDescription,
-                toolchainType,
-                requiredToolchains
-                    .stream()
-                    .map(toolchain -> toolchain.toString())
-                    .collect(joining())));
-      }
-      return toolchains.get(toolchainType);
+    if (!requiredToolchains.contains(toolchainType)) {
+      throw new EvalException(
+          loc,
+          String.format(
+              "In %s, toolchain type %s was requested but only types [%s] are configured",
+              targetDescription,
+              toolchainType,
+              requiredToolchains
+                  .stream()
+                  .map(toolchain -> toolchain.toString())
+                  .collect(joining())));
     }
+    return toolchainProviders.get(toolchainType);
+  }
 
-    /** Returns the toolchain for the given type */
-    public ToolchainInfo getForToolchainType(Label toolchainType) {
-      return toolchains.get(toolchainType);
-    }
+  /** Returns the toolchain for the given type */
+  public ToolchainInfo forToolchainType(Label toolchainType) {
+    return toolchainProviders.get(toolchainType);
+  }
 
-    @Override
-    public boolean containsKey(Object key, Location loc) throws EvalException {
-      Label toolchainType = transformKey(key, loc);
-      return toolchains.containsKey(toolchainType);
-    }
+  @Override
+  public boolean containsKey(Object key, Location loc) throws EvalException {
+    Label toolchainType = transformKey(key, loc);
+    return toolchainProviders.containsKey(toolchainType);
   }
 }
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 47336c0..22e9058 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
@@ -101,13 +101,13 @@
     ToolchainContext toolchainContext = ruleContext.getToolchainContext();
     if (toolchainContext != null) {
       BuildConfiguration config = ruleContext.getConfiguration();
-      for (Label toolchain : toolchainContext.getResolvedToolchainLabels()) {
+      for (Label toolchain : toolchainContext.resolvedToolchainLabels()) {
         maybeImplicitDeps.add(ConfiguredTargetKey.of(toolchain, config));
       }
       maybeImplicitDeps.add(
-          ConfiguredTargetKey.of(toolchainContext.getExecutionPlatform().label(), config));
+          ConfiguredTargetKey.of(toolchainContext.executionPlatform().label(), config));
       maybeImplicitDeps.add(
-          ConfiguredTargetKey.of(toolchainContext.getTargetPlatform().label(), config));
+          ConfiguredTargetKey.of(toolchainContext.targetPlatform().label(), config));
     }
     return ImmutableSet.copyOf(Sets.difference(maybeImplicitDeps, explicitDeps));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 2634773..5dec148 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -656,7 +656,7 @@
   @Override
   public SkylarkIndexable toolchains() throws EvalException {
     checkMutable("toolchains");
-    return ruleContext.getToolchainContext().getResolvedToolchainProviders();
+    return ruleContext.getToolchainContext();
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
index 0139ddf..1d0c229 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
@@ -25,7 +25,6 @@
 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.ToolchainContext.ResolvedToolchainProviders;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options;
@@ -80,10 +79,8 @@
         && ruleContext
             .getFragment(PlatformConfiguration.class)
             .isToolchainTypeEnabled(ruleContext.getLabel())) {
-      ResolvedToolchainProviders providers =
-          (ResolvedToolchainProviders)
-              ruleContext.getToolchainContext().getResolvedToolchainProviders();
-      ToolchainInfo toolchainInfo = providers.getForToolchainType(ruleContext.getLabel());
+      ToolchainInfo toolchainInfo =
+          ruleContext.getToolchainContext().forToolchainType(ruleContext.getLabel());
       if (toolchainInfo != null) {
         toolchainInfo.addGlobalMakeVariables(fragmentBuilder);
       }
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 c119185..63a94cf 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
@@ -38,7 +38,6 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.StaticallyLinkedMarkerProvider;
-import com.google.devtools.build.lib.analysis.ToolchainContext.ResolvedToolchainProviders;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
@@ -455,10 +454,7 @@
 
   private static CcToolchainProvider getToolchainFromPlatformConstraints(
       RuleContext ruleContext, Label toolchainType) {
-    ResolvedToolchainProviders providers =
-        (ResolvedToolchainProviders)
-            ruleContext.getToolchainContext().getResolvedToolchainProviders();
-    return (CcToolchainProvider) providers.getForToolchainType(toolchainType);
+    return (CcToolchainProvider) ruleContext.getToolchainContext().forToolchainType(toolchainType);
   }
 
   private static CcToolchainProvider getToolchainFromCrosstoolTop(
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 71e1be1..cbee20e 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
@@ -452,7 +452,7 @@
               configConditions,
               toolchainContext == null
                   ? ImmutableSet.of()
-                  : toolchainContext.getResolvedToolchainLabels(),
+                  : toolchainContext.resolvedToolchainLabels(),
               transitiveRootCauses,
               defaultBuildOptions,
               ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory());
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java
index 3441c52..3bc97fc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java
@@ -16,14 +16,12 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.SkylarkIndexable;
 
-/**
- * Stores toolchains available to a given rule.
- */
+/** Stores toolchains available to a given rule. */
 @SkylarkModule(
     name = "ToolchainContext",
     category = SkylarkModuleCategory.BUILTIN,
-    doc = "Stores toolchains available to a given rule."
-)
-public interface ToolchainContextApi {
-}
+    doc = "Stores toolchains available to a given rule.")
+public interface ToolchainContextApi extends SkylarkValue, SkylarkIndexable {}
