Remove ConfigurationFragmentFactory.

PiperOrigin-RevId: 343072214
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 2d6be1c..95d3a2f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -112,7 +112,6 @@
         ":options_diff_predicate",
         ":package_specification_provider",
         ":platform_configuration",
-        ":platform_configuration_loader",
         ":platform_options",
         ":print_action_visitor",
         ":provider_collection",
@@ -927,20 +926,6 @@
 )
 
 java_library(
-    name = "platform_configuration_loader",
-    srcs = ["PlatformConfigurationLoader.java"],
-    deps = [
-        ":config/build_options",
-        ":config/fragment",
-        ":config/fragment_provider",
-        ":config/invalid_configuration_exception",
-        ":platform_configuration",
-        ":platform_options",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
     name = "platform_options",
     srcs = ["PlatformOptions.java"],
     deps = [
@@ -1701,17 +1686,12 @@
 java_library(
     name = "config/fragment_provider",
     srcs = [
-        "config/ConfigurationFragmentFactory.java",
         "config/FragmentProvider.java",
     ],
     deps = [
-        ":config/build_options",
         ":config/fragment",
-        ":config/fragment_options",
-        ":config/invalid_configuration_exception",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//third_party:guava",
-        "//third_party:jsr305",
     ],
 )
 
@@ -2287,8 +2267,6 @@
         ":config/core_option_converters",
         ":config/fragment",
         ":config/fragment_options",
-        ":config/fragment_provider",
-        ":config/invalid_configuration_exception",
         ":config/per_label_options",
         ":options_diff_predicate",
         ":test/test_sharding_strategy",
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 5e51012..20c636b 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
@@ -30,7 +30,6 @@
 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.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.ConvenienceSymlinks.SymlinkDefinition;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
@@ -100,8 +99,7 @@
     private Label preludeLabel;
     private String runfilesPrefix;
     private String toolsRepository;
-    private final List<ConfigurationFragmentFactory> configurationFragmentFactories =
-        new ArrayList<>();
+    private final List<Class<? extends Fragment>> configurationFragmentClasses = new ArrayList<>();
     private final List<BuildInfoFactory> buildInfoFactories = new ArrayList<>();
     private final Set<Class<? extends FragmentOptions>> configurationOptions =
         new LinkedHashSet<>();
@@ -198,22 +196,22 @@
     }
 
     /**
-     * Adds a configuration fragment factory and all build options required by its fragment.
+     * Adds a configuration fragment and all build options required by its fragment.
      *
      * <p>Note that configuration fragments annotated with a Starlark name must have a unique name;
      * no two different configuration fragments can share the same name.
      */
-    public Builder addConfigurationFragment(ConfigurationFragmentFactory factory) {
-      this.configurationOptions.addAll(Fragment.requiredOptions(factory.creates()));
-      configurationFragmentFactories.add(factory);
+    public Builder addConfigurationFragment(Class<? extends Fragment> fragmentClass) {
+      this.configurationOptions.addAll(Fragment.requiredOptions(fragmentClass));
+      configurationFragmentClasses.add(fragmentClass);
       return this;
     }
 
     /**
      * Adds configuration options that aren't required by configuration fragments.
      *
-     * <p>If {@link #addConfigurationFragment(ConfigurationFragmentFactory)} adds a fragment factory
-     * that also requires these options, this method is redundant.
+     * <p>If {@link #addConfigurationFragment} adds a fragment that also requires these options,
+     * this method is redundant.
      */
     public Builder addConfigurationOptions(Class<? extends FragmentOptions> configurationOptions) {
       this.configurationOptions.add(configurationOptions);
@@ -418,7 +416,7 @@
           defaultWorkspaceFileSuffix.toString(),
           ImmutableList.copyOf(buildInfoFactories),
           ImmutableList.copyOf(configurationOptions),
-          ImmutableList.copyOf(configurationFragmentFactories),
+          ImmutableList.copyOf(configurationFragmentClasses),
           ImmutableList.copyOf(universalFragments),
           trimmingTransitionFactory,
           toolchainTaggedTrimmingTransition,
@@ -491,7 +489,7 @@
   private final ImmutableList<Class<? extends FragmentOptions>> configurationOptions;
 
   /** The set of configuration fragment factories. */
-  private final ImmutableList<ConfigurationFragmentFactory> configurationFragmentFactories;
+  private final ImmutableList<Class<? extends Fragment>> configurationFragmentClasses;
 
   /**
    * Maps build option names to matching config fragments. This is used to determine correct
@@ -546,7 +544,7 @@
       String defaultWorkspaceFileSuffix,
       ImmutableList<BuildInfoFactory> buildInfoFactories,
       ImmutableList<Class<? extends FragmentOptions>> configurationOptions,
-      ImmutableList<ConfigurationFragmentFactory> configurationFragments,
+      ImmutableList<Class<? extends Fragment>> configurationFragmentClasses,
       ImmutableList<Class<? extends Fragment>> universalFragments,
       @Nullable TransitionFactory<Rule> trimmingTransitionFactory,
       PatchTransition toolchainTaggedTrimmingTransition,
@@ -569,8 +567,8 @@
     this.defaultWorkspaceFileSuffix = defaultWorkspaceFileSuffix;
     this.buildInfoFactories = buildInfoFactories;
     this.configurationOptions = configurationOptions;
-    this.configurationFragmentFactories = configurationFragments;
-    this.optionsToFragmentMap = computeOptionsToFragmentMap(configurationFragments);
+    this.configurationFragmentClasses = configurationFragmentClasses;
+    this.optionsToFragmentMap = computeOptionsToFragmentMap(configurationFragmentClasses);
     this.universalFragments = universalFragments;
     this.trimmingTransitionFactory = trimmingTransitionFactory;
     this.toolchainTaggedTrimmingTransition = toolchainTaggedTrimmingTransition;
@@ -582,7 +580,7 @@
     this.symlinkDefinitions = symlinkDefinitions;
     this.reservedActionMnemonics = reservedActionMnemonics;
     this.actionEnvironmentProvider = actionEnvironmentProvider;
-    this.configurationFragmentMap = createFragmentMap(configurationFragments);
+    this.configurationFragmentMap = createFragmentMap(configurationFragmentClasses);
     this.constraintSemantics = constraintSemantics;
     this.thirdPartyLicenseExistencePolicy = thirdPartyLicenseExistencePolicy;
   }
@@ -594,12 +592,11 @@
    * that's all that's needed to satisfy the config_setting.
    */
   private static Map<String, Class<? extends Fragment>> computeOptionsToFragmentMap(
-      Iterable<ConfigurationFragmentFactory> configurationFragments) {
+      ImmutableList<Class<? extends Fragment>> configurationFragments) {
     Map<String, Class<? extends Fragment>> result = new LinkedHashMap<>();
     Map<Class<? extends FragmentOptions>, Integer> visitedOptionsClasses = new HashMap<>();
-    for (ConfigurationFragmentFactory factory : configurationFragments) {
-      Set<Class<? extends FragmentOptions>> requiredOpts =
-          Fragment.requiredOptions(factory.creates());
+    for (Class<? extends Fragment> fragment : configurationFragments) {
+      Set<Class<? extends FragmentOptions>> requiredOpts = Fragment.requiredOptions(fragment);
       for (Class<? extends FragmentOptions> optionsClass : requiredOpts) {
         Integer previousBest = visitedOptionsClasses.get(optionsClass);
         if (previousBest != null && previousBest <= requiredOpts.size()) {
@@ -611,7 +608,7 @@
         visitedOptionsClasses.put(optionsClass, requiredOpts.size());
         for (Field field : optionsClass.getFields()) {
           if (field.isAnnotationPresent(Option.class)) {
-            result.put(field.getAnnotation(Option.class).name(), factory.creates());
+            result.put(field.getAnnotation(Option.class).name(), fragment);
           }
         }
       }
@@ -663,8 +660,8 @@
 
   /** Returns the set of configuration fragments provided by this module. */
   @Override
-  public ImmutableList<ConfigurationFragmentFactory> getConfigurationFragments() {
-    return configurationFragmentFactories;
+  public ImmutableList<Class<? extends Fragment>> getConfigurationFragments() {
+    return configurationFragmentClasses;
   }
 
   @Nullable
@@ -751,10 +748,9 @@
   }
 
   private static ImmutableMap<String, Class<?>> createFragmentMap(
-      Iterable<ConfigurationFragmentFactory> configurationFragmentFactories) {
+      Iterable<Class<? extends Fragment>> configurationFragments) {
     ImmutableMap.Builder<String, Class<?>> mapBuilder = ImmutableMap.builder();
-    for (ConfigurationFragmentFactory fragmentFactory : configurationFragmentFactories) {
-      Class<? extends Fragment> fragmentClass = fragmentFactory.creates();
+    for (Class<? extends Fragment> fragmentClass : configurationFragments) {
       StarlarkBuiltin fragmentModule = StarlarkAnnotations.getStarlarkBuiltin(fragmentClass);
       if (fragmentModule != null) {
         mapBuilder.put(fragmentModule.name(), fragmentClass);
@@ -834,9 +830,7 @@
   public ImmutableSortedSet<Class<? extends Fragment>> getAllFragments() {
     ImmutableSortedSet.Builder<Class<? extends Fragment>> fragmentsBuilder =
         ImmutableSortedSet.orderedBy(BuildConfiguration.lexicalFragmentSorter);
-    for (ConfigurationFragmentFactory factory : getConfigurationFragments()) {
-      fragmentsBuilder.add(factory.creates());
-    }
+    fragmentsBuilder.addAll(getConfigurationFragments());
     fragmentsBuilder.addAll(getUniversalFragments());
     return fragmentsBuilder.build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
deleted file mode 100644
index 221822f..0000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 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.analysis;
-
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
-import com.google.devtools.build.lib.analysis.config.Fragment;
-
-/** A loader that creates {@link PlatformConfiguration} instances based on command-line options. */
-public class PlatformConfigurationLoader implements ConfigurationFragmentFactory {
-  @Override
-  public Class<? extends Fragment> creates() {
-    return PlatformConfiguration.class;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ShellConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/ShellConfiguration.java
index 80c78d0..b5621cb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ShellConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ShellConfiguration.java
@@ -15,7 +15,6 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -122,12 +121,4 @@
     PathFragment result = OS_SPECIFIC_SHELL.get(os);
     return result != null ? result : defaultShell;
   }
-
-  /** The loader for {@link ShellConfiguration}. */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return ShellConfiguration.class;
-    }
-  }
 }
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/BuildConfiguration.java
index d0477d4..7caa8b5 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/BuildConfiguration.java
@@ -349,10 +349,9 @@
 
     Multimap<Class<? extends Fragment>, Class<? extends FragmentOptions>>
         fragmentToRequiredOptions = ArrayListMultimap.create();
-    for (ConfigurationFragmentFactory fragmentLoader :
+    for (Class<? extends Fragment> fragmentClass :
         ((FragmentProvider) ruleClassProvider).getConfigurationFragments()) {
-      fragmentToRequiredOptions.putAll(
-          fragmentLoader.creates(), Fragment.requiredOptions(fragmentLoader.creates()));
+      fragmentToRequiredOptions.putAll(fragmentClass, Fragment.requiredOptions(fragmentClass));
     }
     Set<Class<? extends FragmentOptions>> options = new HashSet<>();
     for (Class<? extends Fragment> fragmentClass : fragmentClasses) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java
deleted file mode 100644
index 881d02e..0000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2014 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.analysis.config;
-
-/**
- * A factory that instantiates configuration fragments, and which knows some "static" information
- * about these fragments.
- */
-public interface ConfigurationFragmentFactory {
-  /** Returns the exact type of the fragment this factory creates. */
-  Class<? extends Fragment> creates();
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentProvider.java
index 2dc99bf..5ff5f19 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentProvider.java
@@ -22,5 +22,5 @@
  */
 public interface FragmentProvider extends RuleClassProvider {
   /** Returns the set of configuration fragments provided by this module. */
-  ImmutableList<ConfigurationFragmentFactory> getConfigurationFragments();
+  ImmutableList<Class<? extends Fragment>> getConfigurationFragments();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java
index 367c664..f24cde3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestConfiguration.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.analysis.OptionsDiffPredicate;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelConverter;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
@@ -295,14 +294,6 @@
     }
   }
 
-  /** Configuration loader for test options */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return TestConfiguration.class;
-    }
-  }
-
   private final TestOptions options;
   private final ImmutableMap<TestTimeout, Duration> testTimeout;
   private final boolean shouldInclude;
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 cbb39ad..5647310 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
@@ -28,7 +28,6 @@
 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.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 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.FragmentOptions;
@@ -111,7 +110,7 @@
 import com.google.devtools.build.lib.rules.python.PyRuntimeInfo;
 import com.google.devtools.build.lib.rules.python.PyRuntimeRule;
 import com.google.devtools.build.lib.rules.python.PyStarlarkTransitions;
-import com.google.devtools.build.lib.rules.python.PythonConfigurationLoader;
+import com.google.devtools.build.lib.rules.python.PythonConfiguration;
 import com.google.devtools.build.lib.rules.repository.CoreWorkspaceRules;
 import com.google.devtools.build.lib.rules.repository.NewLocalRepositoryRule;
 import com.google.devtools.build.lib.rules.test.TestingSupportRules;
@@ -179,14 +178,6 @@
   @RequiresOptions(options = {StrictActionEnvOptions.class})
   public static class StrictActionEnvConfiguration extends Fragment {
     public StrictActionEnvConfiguration(BuildOptions buildOptions) {}
-
-    /** Loader. */
-    public static class Loader implements ConfigurationFragmentFactory {
-      @Override
-      public Class<? extends Fragment> creates() {
-        return StrictActionEnvConfiguration.class;
-      }
-    }
   }
 
   public static final ActionEnvironmentProvider SHELL_ACTION_ENV =
@@ -265,10 +256,10 @@
               .setPrerequisiteValidator(new BazelPrerequisiteValidator())
               .setActionEnvironmentProvider(SHELL_ACTION_ENV)
               .addConfigurationOptions(ShellConfiguration.Options.class)
-              .addConfigurationFragment(new ShellConfiguration.Loader())
+              .addConfigurationFragment(ShellConfiguration.class)
               .addUniversalConfigurationFragment(ShellConfiguration.class)
               .addUniversalConfigurationFragment(PlatformConfiguration.class)
-              .addConfigurationFragment(new StrictActionEnvConfiguration.Loader())
+              .addConfigurationFragment(StrictActionEnvConfiguration.class)
               .addUniversalConfigurationFragment(StrictActionEnvConfiguration.class)
               .addConfigurationOptions(CoreOptions.class);
         }
@@ -284,7 +275,7 @@
         @Override
         public void init(ConfiguredRuleClassProvider.Builder builder) {
           builder.addConfigurationOptions(ProtoConfiguration.Options.class);
-          builder.addConfigurationFragment(new ProtoConfiguration.Loader());
+          builder.addConfigurationFragment(ProtoConfiguration.class);
           builder.addRuleDefinition(new BazelProtoLibraryRule());
           builder.addRuleDefinition(new ProtoLangToolchainRule());
 
@@ -342,8 +333,8 @@
         public void init(ConfiguredRuleClassProvider.Builder builder) {
           String toolsRepository = checkNotNull(builder.getToolsRepository());
 
-          builder.addConfigurationFragment(new AndroidConfiguration.Loader());
-          builder.addConfigurationFragment(new AndroidLocalTestConfiguration.Loader());
+          builder.addConfigurationFragment(AndroidConfiguration.class);
+          builder.addConfigurationFragment(AndroidLocalTestConfiguration.class);
 
           AndroidNeverlinkAspect androidNeverlinkAspect = new AndroidNeverlinkAspect();
           DexArchiveAspect dexArchiveAspect = new DexArchiveAspect(toolsRepository);
@@ -423,8 +414,8 @@
       new RuleSet() {
         @Override
         public void init(ConfiguredRuleClassProvider.Builder builder) {
-          builder.addConfigurationFragment(new PythonConfigurationLoader());
-          builder.addConfigurationFragment(new BazelPythonConfiguration.Loader());
+          builder.addConfigurationFragment(PythonConfiguration.class);
+          builder.addConfigurationFragment(BazelPythonConfiguration.class);
 
           builder.addRuleDefinition(new BazelPyRuleClasses.PyBaseRule());
           builder.addRuleDefinition(new BazelPyRuleClasses.PyBinaryBaseRule());
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
index e2a50c1..9e57c63 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainRule;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainSuiteRule;
 import com.google.devtools.build.lib.rules.cpp.CppBuildInfo;
-import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader;
+import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses.CcIncludeScanningRule;
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses.CcLinkingRule;
 import com.google.devtools.build.lib.rules.cpp.DebugPackageProvider;
@@ -60,7 +60,7 @@
   @Override
   public void init(ConfiguredRuleClassProvider.Builder builder) {
     GraphNodeAspect graphNodeAspect = new GraphNodeAspect();
-    builder.addConfigurationFragment(new CppConfigurationLoader());
+    builder.addConfigurationFragment(CppConfiguration.class);
     builder.addBuildInfoFactory(new CppBuildInfo());
 
     builder.addNativeAspectClass(graphNodeAspect);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
index f7b68f5..3c8627f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.rules.extra.ActionListenerRule;
 import com.google.devtools.build.lib.rules.extra.ExtraActionRule;
 import com.google.devtools.build.lib.rules.java.JavaCcLinkParamsProvider;
-import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader;
+import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaImportBaseRule;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaOptions;
@@ -62,7 +62,7 @@
   @Override
   public void init(ConfiguredRuleClassProvider.Builder builder) {
     builder.addConfigurationOptions(JavaOptions.class);
-    builder.addConfigurationFragment(new JavaConfigurationLoader());
+    builder.addConfigurationFragment(JavaConfiguration.class);
 
     builder.addBuildInfoFactory(new BazelJavaBuildInfoFactory());
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonConfiguration.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonConfiguration.java
index d5138c1..d4e5d2a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonConfiguration.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.bazel.rules.python;
 
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelConverter;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
@@ -102,16 +101,6 @@
     }
   }
 
-  /**
-   * Loader for the Bazel-specific Python configuration.
-   */
-  public static final class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return BazelPythonConfiguration.class;
-    }
-  }
-
   private final Options options;
 
   public BazelPythonConfiguration(BuildOptions buildOptions) throws InvalidConfigurationException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
index 8b1bce1..619cf1b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
@@ -18,7 +18,6 @@
 import com.google.devtools.build.lib.analysis.Allowlist;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.EmptyToNullLabelConverter;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelConverter;
 import com.google.devtools.build.lib.analysis.config.Fragment;
@@ -951,14 +950,6 @@
     }
   }
 
-  /** Configuration loader for the Android fragment. */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return AndroidConfiguration.class;
-    }
-  }
-
   private final Label sdk;
   private final String cpu;
   private final ConfigurationDistinguisher configurationDistinguisher;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java
index 1b72a0e..6e67b93 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.rules.android;
 
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -43,17 +42,6 @@
     public boolean androidLocalTestBinaryResources;
   }
 
-  /**
-   * Loader class for {@link
-   * com.google.devtools.build.lib.rules.android.AndroidLocalTestConfiguration}.
-   */
-  public static final class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return AndroidLocalTestConfiguration.class;
-    }
-  }
-
   private final boolean androidLocalTestBinaryResources;
 
   public AndroidLocalTestConfiguration(BuildOptions buildOptions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
index 94f0cd8..771aefb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
@@ -21,7 +21,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 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.RequiresOptions;
@@ -465,16 +464,6 @@
   }
 
   /**
-   * Loads {@link AppleConfiguration} from build options.
-   */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return AppleConfiguration.class;
-    }
-  }
-
-  /**
    * Value used to avoid multiple configurations from conflicting. No two instances of this
    * transition may exist with the same value in a single Bazel invocation.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java
index 9516e7a..cb70312 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/swift/SwiftConfiguration.java
@@ -16,7 +16,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -45,12 +44,4 @@
   public ImmutableList<String> getCopts() {
     return copts;
   }
-
-  /** Loads {@link SwiftConfiguration} from build options. */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return SwiftConfiguration.class;
-    }
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfiguration.java
index 0e09701..c905c7e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfiguration.java
@@ -20,7 +20,6 @@
 import com.google.common.hash.Hashing;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -36,17 +35,6 @@
  */
 @RequiresOptions(options = {ConfigFeatureFlagOptions.class})
 public final class ConfigFeatureFlagConfiguration extends Fragment {
-  /**
-   * A configuration fragment loader able to create instances of {@link
-   * ConfigFeatureFlagConfiguration} from {@link ConfigFeatureFlagOptions}.
-   */
-  public static final class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return ConfigFeatureFlagConfiguration.class;
-    }
-  }
-
   private final ImmutableSortedMap<Label, String> flagValues;
   @Nullable private final String flagHash;
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRules.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRules.java
index 50ec64d..7989a2f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRules.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRules.java
@@ -45,7 +45,7 @@
 
     builder.addRuleDefinition(new ConfigRuleClasses.ConfigBaseRule());
     builder.addRuleDefinition(new ConfigRuleClasses.ConfigSettingRule());
-    builder.addConfigurationFragment(new ConfigFeatureFlagConfiguration.Loader());
+    builder.addConfigurationFragment(ConfigFeatureFlagConfiguration.class);
 
     builder.addRuleDefinition(new ConfigRuleClasses.ConfigFeatureFlagRule());
     builder.addStarlarkBootstrap(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java b/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java
index 85ff748..8caec8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java
@@ -32,7 +32,7 @@
   public void init(ConfiguredRuleClassProvider.Builder builder) {
     builder.setShouldInvalidateCacheForOptionDiff(
         TestConfiguration.SHOULD_INVALIDATE_FOR_OPTION_DIFF);
-    builder.addConfigurationFragment(new TestConfiguration.Loader());
+    builder.addConfigurationFragment(TestConfiguration.class);
     builder.addTrimmingTransitionFactory(new TestTrimmingTransitionFactory());
     builder.addRuleDefinition(new BaseRuleClasses.RootRule());
     builder.addRuleDefinition(new BaseRuleClasses.BaseRule());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
index 5ddec98..4053977 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
@@ -34,8 +34,8 @@
  * Implementation of the {@code cc_toolchain_suite} rule.
  *
  * <p>This is currently a no-op because the logic that transforms this rule into something that can
- * be understood by the {@code cc_*} rules is in
- * {@link com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader}.
+ * be understood by the {@code cc_*} rules is in {@link
+ * com.google.devtools.build.lib.rules.cpp.CppConfiguration}.
  */
 public class CcToolchainSuite implements RuleConfiguredTargetFactory {
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java
deleted file mode 100644
index 0c7782f..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 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.rules.cpp;
-
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
-import com.google.devtools.build.lib.analysis.config.Fragment;
-
-/**
- * Loader for C++ configurations.
- */
-public class CppConfigurationLoader implements ConfigurationFragmentFactory {
-  @Override
-  public Class<? extends Fragment> creates() {
-    return CppConfiguration.class;
-  }
-
-  /** Creates a new {@link CppConfigurationLoader} instance. */
-  public CppConfigurationLoader() {}
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
index b4207c8..17c6781 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.rules.genquery;
 
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -40,13 +39,6 @@
     public boolean compressInMemoryResults;
   }
 
-  static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return GenQueryConfiguration.class;
-    }
-  }
-
   private final boolean inMemoryCompressionEnabled;
 
   public GenQueryConfiguration(BuildOptions buildOptions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
index 590b049..0b84c68 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
@@ -33,7 +33,7 @@
 
   /** Adds {@link GenQueryRule} and its dependencies to the provided builder. */
   public static void register(ConfiguredRuleClassProvider.Builder builder) {
-    builder.addConfigurationFragment(new GenQueryConfiguration.Loader());
+    builder.addConfigurationFragment(GenQueryConfiguration.class);
     builder.addRuleDefinition(new GenQueryRule());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
index 93e2ba9..7835f00 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -14,7 +14,6 @@
         "GenericBuildInfoPropertiesTranslator.java",
         "JavaBinary.java",
         "JavaCcLinkParamsProvider.java",
-        "JavaConfigurationLoader.java",
         "JavaImport.java",
         "JavaImportBaseRule.java",
         "JavaInfo.java",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java
deleted file mode 100644
index e256bbc..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfigurationLoader.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 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.rules.java;
-
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
-import com.google.devtools.build.lib.analysis.config.Fragment;
-
-/**
- * A loader that creates JavaConfiguration instances based on JavaBuilder configurations and
- * command-line options.
- */
-public class JavaConfigurationLoader implements ConfigurationFragmentFactory {
-  @Override
-  public Class<? extends Fragment> creates() {
-    return JavaConfiguration.class;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractObjcRuleSet.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractObjcRuleSet.java
index fb69429..bfa8da8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractObjcRuleSet.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractObjcRuleSet.java
@@ -43,11 +43,11 @@
 
     builder.addBuildInfoFactory(new ObjcBuildInfoFactory());
 
-    builder.addConfigurationFragment(new ObjcConfigurationLoader());
-    builder.addConfigurationFragment(new AppleConfiguration.Loader());
-    builder.addConfigurationFragment(new SwiftConfiguration.Loader());
+    builder.addConfigurationFragment(ObjcConfiguration.class);
+    builder.addConfigurationFragment(AppleConfiguration.class);
+    builder.addConfigurationFragment(SwiftConfiguration.class);
     // j2objc shouldn't be here!
-    builder.addConfigurationFragment(new J2ObjcConfiguration.Loader());
+    builder.addConfigurationFragment(J2ObjcConfiguration.class);
 
     builder.addNativeAspectClass(objcProtoAspect);
     builder.addRuleDefinition(new AppleBinaryRule(objcProtoAspect));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
index 5cb50c4..12b7016 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
@@ -17,7 +17,6 @@
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
 import com.google.devtools.build.lib.analysis.starlark.annotations.StarlarkConfigurationField;
@@ -66,16 +65,6 @@
   static final String INVALID_TRANSLATION_FLAGS_MSG_TEMPLATE =
       "J2Objc translation flags: %s not supported. Unsupported flags are: %s";
 
-  /**
-   * Configuration loader for {@link J2ObjcConfiguration}.
-   */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return J2ObjcConfiguration.class;
-    }
-  }
-
   private final ImmutableList<String> translationFlags;
   private final boolean removeDeadCode;
   private final boolean experimentalJ2ObjcHeaderMap;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java
deleted file mode 100644
index ca4b691..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfigurationLoader.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 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.rules.objc;
-
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
-import com.google.devtools.build.lib.analysis.config.Fragment;
-
-/**
- * A loader that creates ObjcConfiguration instances based on Objective-C configurations and
- * command-line options.
- */
-public class ObjcConfigurationLoader implements ConfigurationFragmentFactory {
-  @Override
-  public Class<? extends Fragment> creates() {
-    return ObjcConfiguration.class;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD
index 45f58bc..a759841 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD
@@ -22,7 +22,6 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:config/config_matching_provider",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/analysis:file_provider",
-        "//src/main/java/com/google/devtools/build/lib/analysis:platform_configuration_loader",
         "//src/main/java/com/google/devtools/build/lib/analysis:platform_options",
         "//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
         "//src/main/java/com/google/devtools/build/lib/analysis:template_variable_info",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformRules.java b/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformRules.java
index 427c1d0..d0f5b145 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformRules.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformRules.java
@@ -16,7 +16,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
-import com.google.devtools.build.lib.analysis.PlatformConfigurationLoader;
+import com.google.devtools.build.lib.analysis.PlatformConfiguration;
 import com.google.devtools.build.lib.analysis.PlatformOptions;
 import com.google.devtools.build.lib.rules.core.CoreRules;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.PlatformBootstrap;
@@ -34,7 +34,7 @@
   @Override
   public void init(ConfiguredRuleClassProvider.Builder builder) {
     builder.addConfigurationOptions(PlatformOptions.class);
-    builder.addConfigurationFragment(new PlatformConfigurationLoader());
+    builder.addConfigurationFragment(PlatformConfiguration.class);
 
     builder.addRuleDefinition(new PlatformBaseRule());
     builder.addRuleDefinition(new ConstraintSettingRule());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java
index 4da8c73..6965865 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java
@@ -16,7 +16,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.StrictDepsMode;
 import com.google.devtools.build.lib.analysis.config.Fragment;
@@ -192,16 +191,6 @@
     }
   }
 
-  /**
-   * Loader class for proto.
-   */
-  public static class Loader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return ProtoConfiguration.class;
-    }
-  }
-
   private final ImmutableList<String> protocOpts;
   private final ImmutableList<String> ccProtoLibraryHeaderSuffixes;
   private final ImmutableList<String> ccProtoLibrarySourceSuffixes;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java
deleted file mode 100644
index f1a3f33..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfigurationLoader.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 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.rules.python;
-
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
-import com.google.devtools.build.lib.analysis.config.Fragment;
-
-/**
- * A factory implementation for {@link PythonConfiguration} objects.
- */
-public class PythonConfigurationLoader implements ConfigurationFragmentFactory {
-  @Override
-  public Class<? extends Fragment> creates() {
-    return PythonConfiguration.class;
-  }
-}
-
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 c270e35..5d19254 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
@@ -31,7 +31,6 @@
 import com.google.common.collect.Table;
 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.ConfigurationFragmentFactory;
 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.FragmentOptions;
@@ -379,12 +378,11 @@
     ImmutableSortedMap.Builder<
             Class<? extends Fragment>, ImmutableSortedSet<Class<? extends FragmentOptions>>>
         fragments = ImmutableSortedMap.orderedBy((c1, c2) -> c1.getName().compareTo(c2.getName()));
-    for (ConfigurationFragmentFactory fragmentFactory :
-        ruleClassProvider.getConfigurationFragments()) {
+    for (Class<? extends Fragment> fragmentClass : ruleClassProvider.getConfigurationFragments()) {
       fragments.put(
-          fragmentFactory.creates(),
+          fragmentClass,
           ImmutableSortedSet.copyOf(
-              comparing(Class::getName), Fragment.requiredOptions(fragmentFactory.creates())));
+              comparing(Class::getName), Fragment.requiredOptions(fragmentClass)));
     }
     return fragments.build();
   }
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 9a8dde2..be80666 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
@@ -28,7 +28,6 @@
 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.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.config.OutputDirectories.InvalidMnemonicException;
@@ -168,7 +167,7 @@
 
   private Fragment makeFragment(FragmentKey fragmentKey) throws InvalidConfigurationException {
     BuildOptions buildOptions = fragmentKey.getBuildOptions();
-    Class<? extends Fragment> fragmentClass = getFactory(fragmentKey.getFragmentClass()).creates();
+    Class<? extends Fragment> fragmentClass = fragmentKey.getFragmentClass();
     String noConstructorPattern = "%s lacks constructor(BuildOptions)";
     try {
       Fragment fragment =
@@ -184,16 +183,6 @@
     }
   }
 
-  private ConfigurationFragmentFactory getFactory(Class<? extends Fragment> fragmentType) {
-    for (ConfigurationFragmentFactory factory : ruleClassProvider.getConfigurationFragments()) {
-      if (factory.creates().equals(fragmentType)) {
-        return factory;
-      }
-    }
-    throw new IllegalStateException(
-        "There is no factory for fragment: " + fragmentType.getSimpleName());
-  }
-
   @Override
   public String extractTag(SkyKey skyKey) {
     return null;
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 91f0ae3..2c08e91 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
@@ -1931,7 +1931,6 @@
     // TODO(gregce): support trimmed configs.
     ImmutableSortedSet<Class<? extends Fragment>> allFragments =
         ruleClassProvider.getConfigurationFragments().stream()
-            .map(factory -> factory.creates())
             .collect(
                 ImmutableSortedSet.toImmutableSortedSet(BuildConfiguration.lexicalFragmentSorter));
 
@@ -2918,7 +2917,6 @@
     FragmentClassSet allFragments =
         FragmentClassSet.of(
             ruleClassProvider.getConfigurationFragments().stream()
-                .map(factory -> factory.creates())
                 .collect(
                     ImmutableSortedSet.toImmutableSortedSet(
                         BuildConfiguration.lexicalFragmentSorter)));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index 8b393e5..871a41e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -16,7 +16,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -138,8 +137,7 @@
       // Declared by the rule class:
       ConfigurationFragmentPolicy configurationFragmentPolicy =
           rule.getRuleClassObject().getConfigurationFragmentPolicy();
-      for (ConfigurationFragmentFactory factory : ruleClassProvider.getConfigurationFragments()) {
-        Class<? extends Fragment> fragment = factory.creates();
+      for (Class<? extends Fragment> fragment : ruleClassProvider.getConfigurationFragments()) {
         // isLegalConfigurationFragment considers both natively declared fragments and Starlark
         // (named) fragments.
         if (configurationFragmentPolicy.isLegalConfigurationFragment(fragment)) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index b24fee5..1df1997 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -24,7 +24,6 @@
 import com.google.devtools.build.lib.actions.Action;
 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.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -617,20 +616,13 @@
     public DiffResetFragment(BuildOptions buildOptions) {}
   }
 
-  private static final class DiffResetFactory implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return DiffResetFragment.class;
-    }
-  }
-
   private void setupDiffResetTesting() throws Exception {
     ImmutableSet<OptionDefinition> optionsThatCanChange =
         ImmutableSet.of(
             DiffResetOptions.PROBABLY_IRRELEVANT_OPTION, DiffResetOptions.ALSO_IRRELEVANT_OPTION);
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
-    builder.addConfigurationFragment(new DiffResetFactory());
+    builder.addConfigurationFragment(DiffResetFragment.class);
     builder.overrideShouldInvalidateCacheForOptionDiffForTesting(
         (newOptions, changedOption, oldValue, newValue) -> {
           return !optionsThatCanChange.contains(changedOption);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
index f3769e6..3dd8011 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
@@ -88,7 +88,7 @@
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
     builder.addRuleDefinition(LateBoundSplitUtil.RULE_WITH_TEST_FRAGMENT);
-    builder.addConfigurationFragment(new LateBoundSplitUtil.FragmentLoader());
+    builder.addConfigurationFragment(LateBoundSplitUtil.TestFragment.class);
     builder.addConfigurationOptions(LateBoundSplitUtil.TestOptions.class);
     builder.addRuleDefinition(LATE_BOUND_DEP_RULE);
     useRuleClassProvider(builder.build());
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
index 2886c3c..4422aeb 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
@@ -17,7 +17,6 @@
 
 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.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -59,16 +58,6 @@
   }
 
   /**
-   * The fragment's loader.
-   */
-  static class FragmentLoader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-     return TestFragment.class;
-    }
-  }
-
-  /**
    * A custom rule that requires {@link TestFragment}.
    */
   static final RuleDefinition RULE_WITH_TEST_FRAGMENT = (MockRule) () -> MockRule.define(
@@ -82,7 +71,7 @@
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
     builder.addRuleDefinition(RULE_WITH_TEST_FRAGMENT);
-    builder.addConfigurationFragment(new FragmentLoader());
+    builder.addConfigurationFragment(TestFragment.class);
     builder.addConfigurationOptions(TestOptions.class);
     return builder.build();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
index 70aa7e0..c0ee949 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
@@ -24,7 +24,7 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Maps;
 import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.analysis.StarlarkRuleTransitionProviderTest.DummyTestLoader;
+import com.google.devtools.build.lib.analysis.StarlarkRuleTransitionProviderTest.DummyTestFragment;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
 import com.google.devtools.build.lib.analysis.starlark.FunctionTransitionUtil;
@@ -60,7 +60,7 @@
   protected ConfiguredRuleClassProvider createRuleClassProvider() {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
-    builder.addConfigurationFragment(new DummyTestLoader());
+    builder.addConfigurationFragment(DummyTestFragment.class);
     return builder.build();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java
index f34ff27..97cbb46 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java
@@ -18,7 +18,6 @@
 import com.google.common.collect.ImmutableMap;
 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.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.EmptyToNullLabelConverter;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
@@ -86,19 +85,11 @@
     public boolean bool;
   }
 
-  /** Loads a new {link @DummyTestFragment} instance. */
-  protected static class DummyTestLoader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return DummyTestFragment.class;
-    }
-  }
-
   @Override
   protected ConfiguredRuleClassProvider createRuleClassProvider() {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
-    builder.addConfigurationFragment(new DummyTestLoader());
+    builder.addConfigurationFragment(DummyTestFragment.class);
     return builder.build();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
index df01d84..8e8bdc8 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
@@ -27,21 +27,9 @@
     ],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
-        "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_provider",
-        "//src/main/java/com/google/devtools/build/lib/analysis:platform_configuration_loader",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository",
         "//src/main/java/com/google/devtools/build/lib/bazel/rules",
-        "//src/main/java/com/google/devtools/build/lib/bazel/rules/python",
         "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function",
-        "//src/main/java/com/google/devtools/build/lib/rules/android",
-        "//src/main/java/com/google/devtools/build/lib/rules/apple",
-        "//src/main/java/com/google/devtools/build/lib/rules/apple/swift",
-        "//src/main/java/com/google/devtools/build/lib/rules/config",
-        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
-        "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
-        "//src/main/java/com/google/devtools/build/lib/rules/objc",
-        "//src/main/java/com/google/devtools/build/lib/rules/proto",
-        "//src/main/java/com/google/devtools/build/lib/rules/python",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/test/java/com/google/devtools/build/lib/analysis/util:util_internal",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index 64694ac..0d86709 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -20,30 +20,17 @@
 import com.google.common.collect.Iterables;
 import com.google.common.io.MoreFiles;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.PlatformConfigurationLoader;
 import com.google.devtools.build.lib.analysis.ShellConfiguration;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformFunction;
 import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformRule;
 import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
-import com.google.devtools.build.lib.bazel.rules.python.BazelPythonConfiguration;
 import com.google.devtools.build.lib.packages.util.BazelMockCcSupport;
 import com.google.devtools.build.lib.packages.util.BazelMockPythonSupport;
 import com.google.devtools.build.lib.packages.util.MockCcSupport;
 import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
 import com.google.devtools.build.lib.packages.util.MockPythonSupport;
 import com.google.devtools.build.lib.packages.util.MockToolsConfig;
-import com.google.devtools.build.lib.rules.android.AndroidConfiguration;
-import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
-import com.google.devtools.build.lib.rules.apple.swift.SwiftConfiguration;
-import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagConfiguration;
-import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader;
-import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader;
-import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration;
-import com.google.devtools.build.lib.rules.objc.ObjcConfigurationLoader;
-import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
-import com.google.devtools.build.lib.rules.python.PythonConfigurationLoader;
 import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -451,24 +438,6 @@
   }
 
   @Override
-  public List<ConfigurationFragmentFactory> getDefaultConfigurationFragmentFactories() {
-    return ImmutableList.of(
-        new CppConfigurationLoader(),
-        new ShellConfiguration.Loader(),
-        new PythonConfigurationLoader(),
-        new BazelPythonConfiguration.Loader(),
-        new JavaConfigurationLoader(),
-        new ObjcConfigurationLoader(),
-        new AppleConfiguration.Loader(),
-        new SwiftConfiguration.Loader(),
-        new J2ObjcConfiguration.Loader(),
-        new ProtoConfiguration.Loader(),
-        new ConfigFeatureFlagConfiguration.Loader(),
-        new AndroidConfiguration.Loader(),
-        new PlatformConfigurationLoader());
-  }
-
-  @Override
   public ConfiguredRuleClassProvider createRuleClassProvider() {
     return TestRuleClassProvider.getRuleClassProvider(true);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
index a386679..ed333f2 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
@@ -17,7 +17,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryFunction;
 import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryRule;
 import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryFunction;
@@ -103,9 +102,6 @@
     // Do nothing by default.
   }
 
-  /** Returns the default factories for configuration fragments used in tests. */
-  public abstract List<ConfigurationFragmentFactory> getDefaultConfigurationFragmentFactories();
-
   @Override
   public abstract ConfiguredRuleClassProvider createRuleClassProvider();
 
@@ -179,11 +175,6 @@
     }
 
     @Override
-    public List<ConfigurationFragmentFactory> getDefaultConfigurationFragmentFactories() {
-      return delegate.getDefaultConfigurationFragmentFactories();
-    }
-
-    @Override
     public ConfiguredRuleClassProvider createRuleClassProvider() {
       return delegate.createRuleClassProvider();
     }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 5b87ff9..ae61bb3 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -43,7 +43,6 @@
 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.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition;
@@ -655,17 +654,4 @@
     useRuleClassProvider(builder.build());
     update();
   }
-
-  /**
-   * Makes custom configuration fragments available in tests.
-   */
-  protected final void setConfigFragmentsAvailableInTests(
-      ConfigurationFragmentFactory... factories) throws Exception {
-    ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
-    TestRuleClassProvider.addStandardRules(builder);
-    for (ConfigurationFragmentFactory factory : factories) {
-      builder.addConfigurationFragment(factory);
-    }
-    useRuleClassProvider(builder.build());
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index 36604f8..30448f1 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -27,7 +27,6 @@
 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.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.clock.BlazeClock;
@@ -86,7 +85,6 @@
   protected Path workspace;
   protected AnalysisMock analysisMock;
   protected SequencedSkyframeExecutor skyframeExecutor;
-  protected List<ConfigurationFragmentFactory> configurationFragmentFactories;
   protected ImmutableList<Class<? extends FragmentOptions>> buildOptionClasses;
   protected final ActionKeyContext actionKeyContext = new ActionKeyContext();
 
@@ -179,7 +177,6 @@
     mockToolsConfig = new MockToolsConfig(rootDirectory);
     analysisMock.setupMockClient(mockToolsConfig);
     analysisMock.setupMockWorkspaceFiles(directories.getEmbeddedBinariesRoot());
-    configurationFragmentFactories = analysisMock.getDefaultConfigurationFragmentFactories();
     buildOptionClasses = ruleClassProvider.getConfigurationOptions();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
index 366a09c..fc54f4b 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
@@ -25,7 +25,6 @@
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
 import com.google.devtools.build.lib.analysis.ShellConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 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.FragmentOptions;
@@ -60,12 +59,11 @@
     }
 
     List<Class<? extends FragmentOptions>> configOptions = provider.getConfigurationOptions();
-    for (ConfigurationFragmentFactory fragmentFactory : provider.getConfigurationFragments()) {
+    for (Class<? extends Fragment> fragmentClass : provider.getConfigurationFragments()) {
       // Check that every created fragment is present.
-      assertThat(configurationFragments).contains(fragmentFactory.creates());
+      assertThat(configurationFragments).contains(fragmentClass);
       // Check that every options class required for fragment creation is provided.
-      for (Class<? extends FragmentOptions> options :
-          Fragment.requiredOptions(fragmentFactory.creates())) {
+      for (Class<? extends FragmentOptions> options : Fragment.requiredOptions(fragmentClass)) {
         assertThat(configOptions).contains(options);
       }
     }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java b/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java
index 9a32796..0436ac0 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/LateBoundAliasTest.java
@@ -19,7 +19,6 @@
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -43,14 +42,6 @@
     public TestFragment(BuildOptions buildOptions) {}
   }
 
-  private static final class TestFragmentOptionFactory implements ConfigurationFragmentFactory {
-
-    @Override
-    public Class<? extends Fragment> creates() {
-      return TestFragment.class;
-    }
-  }
-
   private static final class TestLateBoundDefault extends LabelLateBoundDefault<TestFragment> {
 
     private TestLateBoundDefault() {
@@ -73,7 +64,7 @@
   protected ConfiguredRuleClassProvider createRuleClassProvider() {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
-    builder.addConfigurationFragment(new TestFragmentOptionFactory());
+    builder.addConfigurationFragment(TestFragment.class);
     builder.addRuleDefinition(new MyTestRule());
     return builder.build();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java
index 6f2815e..176bc40 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java
@@ -19,7 +19,6 @@
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
-import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.RequiresOptions;
@@ -124,20 +123,13 @@
     }
   }
 
-  private static class DummyTestOptionsLoader implements ConfigurationFragmentFactory {
-    @Override
-    public Class<? extends Fragment> creates() {
-      return DummyTestOptionsFragment.class;
-    }
-  }
-
   @Override
   protected ConfiguredRuleClassProvider createRuleClassProvider() {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
     TestRuleClassProvider.addStandardRules(builder);
     builder.addRuleDefinition(new FeatureFlagSetterRule());
     builder.addConfigurationOptions(DummyTestOptions.class);
-    builder.addConfigurationFragment(new DummyTestOptionsLoader());
+    builder.addConfigurationFragment(DummyTestOptionsFragment.class);
     return builder.build();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
index c3789a1..fe26755 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
@@ -35,7 +35,6 @@
 import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
 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.ConfigurationFragmentFactory;
 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.FragmentOptions;
@@ -188,7 +187,7 @@
         .setPrelude("//:prelude.bzl")
         // must be part of BuildOptions for various reasons e.g. dynamic configs
         .addConfigurationOptions(CoreOptions.class)
-        .addConfigurationFragment(new TestConfiguration.Loader())
+        .addConfigurationFragment(TestConfiguration.class)
         // needed for the default workspace
         .addRuleDefinition(new WorkspaceBaseRule())
         .addRuleDefinition(new BindRule())
@@ -367,11 +366,11 @@
                     });
 
     builder
-        .addConfigurationFragment(AConfig.FACTORY)
-        .addConfigurationFragment(BConfig.FACTORY)
-        .addConfigurationFragment(CConfig.FACTORY)
-        .addConfigurationFragment(DConfig.FACTORY)
-        .addConfigurationFragment(EConfig.FACTORY)
+        .addConfigurationFragment(AConfig.class)
+        .addConfigurationFragment(BConfig.class)
+        .addConfigurationFragment(CConfig.class)
+        .addConfigurationFragment(DConfig.class)
+        .addConfigurationFragment(EConfig.class)
         .addRuleDefinition(transitionRule)
         .addRuleDefinition(alphaRule)
         .addRuleDefinition(bravoRule)
@@ -402,21 +401,6 @@
     }
   }
 
-  /** General purpose fragment loader for the test fragments in this file. */
-  private static final class FragmentLoader<FragmentT extends Fragment>
-      implements ConfigurationFragmentFactory {
-    private final Class<FragmentT> fragmentType;
-
-    FragmentLoader(Class<FragmentT> fragmentType) {
-      this.fragmentType = fragmentType;
-    }
-
-    @Override
-    public Class<? extends Fragment> creates() {
-      return fragmentType;
-    }
-  }
-
   /** Set of test options. */
   public static final class AOptions extends FragmentOptions {
     @Option(
@@ -431,8 +415,6 @@
   @StarlarkBuiltin(name = "alpha", doc = "Test config fragment.")
   @RequiresOptions(options = {AOptions.class})
   public static final class AConfig extends Fragment implements StarlarkValue {
-    public static final ConfigurationFragmentFactory FACTORY = new FragmentLoader<>(AConfig.class);
-
     private final String value;
 
     public AConfig(BuildOptions buildOptions) {
@@ -459,8 +441,6 @@
   @StarlarkBuiltin(name = "bravo", doc = "Test config fragment.")
   @RequiresOptions(options = {BOptions.class})
   public static final class BConfig extends Fragment implements StarlarkValue {
-    public static final ConfigurationFragmentFactory FACTORY = new FragmentLoader<>(BConfig.class);
-
     private final String value;
 
     public BConfig(BuildOptions buildOptions) {
@@ -487,8 +467,6 @@
   @StarlarkBuiltin(name = "charlie", doc = "Test config fragment.")
   @RequiresOptions(options = {COptions.class})
   public static final class CConfig extends Fragment implements StarlarkValue {
-    public static final ConfigurationFragmentFactory FACTORY = new FragmentLoader<>(CConfig.class);
-
     private final String value;
 
     public CConfig(BuildOptions buildOptions) {
@@ -515,8 +493,6 @@
   @StarlarkBuiltin(name = "delta", doc = "Test config fragment.")
   @RequiresOptions(options = {DOptions.class})
   public static final class DConfig extends Fragment implements StarlarkValue {
-    public static final ConfigurationFragmentFactory FACTORY = new FragmentLoader<>(DConfig.class);
-
     private final String value;
 
     public DConfig(BuildOptions buildOptions) {
@@ -546,8 +522,6 @@
   @StarlarkBuiltin(name = "echo", doc = "Test config fragment.")
   @RequiresOptions(options = {EOptions.class})
   public static final class EConfig extends Fragment implements StarlarkValue {
-    public static final ConfigurationFragmentFactory FACTORY = new FragmentLoader<>(EConfig.class);
-
     private final String value;
 
     public EConfig(BuildOptions buildOptions) {