diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index 53ec1ee33b5df977cdb90baac98637fbefc08b71..6812b905f46a4c508a1c800909a87841e832aa87 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -1477,21 +1477,10 @@ class Formula
     end
   end
 
-  # Clear cache of .racks
-  def self.clear_racks_cache
-    @racks = nil
-  end
-
-  # Clear caches of .racks and .installed.
-  def self.clear_installed_formulae_cache
-    clear_racks_cache
-    @installed = nil
-  end
-
   # An array of all racks currently installed.
   # @private
   def self.racks
-    @racks ||= if HOMEBREW_CELLAR.directory?
+    Formula.cache[:racks] ||= if HOMEBREW_CELLAR.directory?
       HOMEBREW_CELLAR.subdirs.reject do |rack|
         rack.symlink? || rack.basename.to_s.start_with?(".") || rack.subdirs.empty?
       end
@@ -1503,7 +1492,7 @@ class Formula
   # An array of all installed {Formula}
   # @private
   def self.installed
-    @installed ||= racks.flat_map do |rack|
+    Formula.cache[:installed] ||= racks.flat_map do |rack|
       Formulary.from_rack(rack)
     rescue
       []
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index 9911f18d27e9357155a3acfcc9561adcb36112ed..c9a29c331538d21ef207eedc023aba9729d42f25 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -854,10 +854,11 @@ class FormulaInstaller
   end
 
   def link(keg)
+    Formula.clear_cache
+
     unless link_keg
       begin
         keg.optlink(verbose: verbose?)
-        Formula.clear_cache
       rescue Keg::LinkError => e
         onoe "Failed to create #{formula.opt_prefix}"
         puts "Things that depend on #{formula.full_name} will probably not build."
diff --git a/Library/Homebrew/tab.rb b/Library/Homebrew/tab.rb
index 099eb3b1e96478903e0f1d96552e50abe1834327..d1bf8fc2413da7c73cb9a915b67ad6c3d436696a 100644
--- a/Library/Homebrew/tab.rb
+++ b/Library/Homebrew/tab.rb
@@ -355,7 +355,7 @@ class Tab < OpenStruct
   def write
     # If this is a new installation, the cache of installed formulae
     # will no longer be valid.
-    Formula.clear_installed_formulae_cache unless tabfile.exist?
+    Formula.clear_cache unless tabfile.exist?
 
     self.class.cache[tabfile] = self
     tabfile.atomic_write(to_json)
diff --git a/Library/Homebrew/test/keg_spec.rb b/Library/Homebrew/test/keg_spec.rb
index 4c81962a16cda664583eb70c6be5cb53da2938ae..73e87d6c9aeefaa41edcde8763cc00436d22588f 100644
--- a/Library/Homebrew/test/keg_spec.rb
+++ b/Library/Homebrew/test/keg_spec.rb
@@ -36,7 +36,6 @@ describe Keg do
   end
 
   specify "::all" do
-    Formula.clear_racks_cache
     expect(described_class.all).to eq([keg])
   end
 
diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb
index 9eb4d981d38602d746474db9ac769886a03b8203..1fa4e8313fa09b1c4814a67d5c94e1c6b2c48d01 100644
--- a/Library/Homebrew/upgrade.rb
+++ b/Library/Homebrew/upgrade.rb
@@ -128,6 +128,7 @@ module Homebrew
                           .select do |f|
           keg = f.any_installed_keg
           next unless keg
+          next unless keg.directory?
 
           LinkageChecker.new(keg, cache_db: db)
                         .broken_library_linkage?
@@ -186,7 +187,7 @@ module Homebrew
 
       upgrade_formulae(upgradeable_dependents, args: args)
 
-      # Refresh installed formulae after upgrading
+      # Update installed formulae after upgrading
       installed_formulae = FormulaInstaller.installed.to_a
 
       # Assess the dependents tree again now we've upgraded.