diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index 5c2c8454d28963c6504371957d724f6a340add0b..811ae0bf7507e597b00cedf3fd8929d6ebcecdce 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -183,6 +183,22 @@ class Entrypoint {
           changed);
     }).map((package) => package.name).toSet();
 
+    if (dirExists(depsDir)) {
+      // Delete any cached dependencies that are going to be recached.
+      for (var package in dependenciesToPrecompile) {
+        deleteEntry(path.join(depsDir, package));
+      }
+
+      // Also delete any cached dependencies that should no longer be cached.
+      for (var subdir in listDir(depsDir)) {
+        var package = graph.packages[path.basename(subdir)];
+        if (package == null || package.pubspec.transformers.isEmpty ||
+            graph.isPackageMutable(package.name)) {
+          deleteEntry(subdir);
+        }
+      }
+    }
+
     if (dependenciesToPrecompile.isEmpty) return;
 
     await log.progress("Precompiling dependencies", () async {
@@ -190,11 +206,6 @@ class Entrypoint {
           unionAll(dependenciesToPrecompile.map(graph.transitiveDependencies))
           .map((package) => package.name).toSet();
 
-      // TODO(nweiz): Use for/in here when
-      // https://github.com/dart-lang/async_await/issues/68 is fixed.
-      dependenciesToPrecompile.forEach((package) =>
-          deleteEntry(path.join(depsDir, package)));
-
       var environment = await AssetEnvironment.create(this, BarbackMode.DEBUG,
           packages: packagesToLoad, useDart2JS: false);
 
diff --git a/test/get/cache_transformed_dependency_test.dart b/test/get/cache_transformed_dependency_test.dart
index 613d9cbd99099a608bd6e98180b76344632abc3a..f19780569eb146c9e17582b15834aa22daca9899 100644
--- a/test/get/cache_transformed_dependency_test.dart
+++ b/test/get/cache_transformed_dependency_test.dart
@@ -376,6 +376,51 @@ main() {
         "lib/foo.dart: true, lib/does/not/exist.dart: false");
     endPubServe();
   });
+
+  // Regression test for issue 21810.
+  integration("decaches when the dependency is updated to something "
+      "untransformed", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+
+      builder.serve("foo", "1.2.4",
+          deps: {'barback': 'any'},
+          contents: [
+        d.dir("lib", [
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Goodbye!';")
+      ])
+    ]).validate();
+
+    // Upgrade to the new version of foo.
+    d.appDir({"foo": "1.2.4"}).create();
+
+    pubGet(output: isNot(contains("Precompiled foo.")));
+
+    d.dir(appPath, [
+      d.nothing(".pub/deps/debug/foo")
+    ]).validate();
+  });
 }
 
 String replaceTransformer(String input, String output) {