diff --git a/Library/Homebrew/cmd/gist-logs.rb b/Library/Homebrew/cmd/gist-logs.rb
index 346ee8ab6eacdf0a595787a604abd5e11baa0bfa..a7f95f353af41d8d3a5e43fcf65ea2574cf3698e 100644
--- a/Library/Homebrew/cmd/gist-logs.rb
+++ b/Library/Homebrew/cmd/gist-logs.rb
@@ -8,6 +8,8 @@ require "socket"
 require "cli/parser"
 
 module Homebrew
+  extend Install
+
   module_function
 
   def gist_logs_args
@@ -142,8 +144,8 @@ module Homebrew
   def gist_logs
     gist_logs_args.parse
 
-    Install.perform_preinstall_checks(all_fatal: true)
-    Install.perform_build_from_source_checks(all_fatal: true)
+    perform_preinstall_checks(all_fatal: true)
+    perform_build_from_source_checks(all_fatal: true)
     gistify_logs(args.resolved_formulae.first)
   end
 end
diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb
index 7725ef1a1124dd72874ec767801df26642ffbc02..71671228d4fad0eeed2e936fd0258ffa7caf186b 100644
--- a/Library/Homebrew/cmd/install.rb
+++ b/Library/Homebrew/cmd/install.rb
@@ -10,10 +10,11 @@ require "cli/parser"
 require "upgrade"
 
 module Homebrew
-  module_function
-
+  extend Install
   extend Search
 
+  module_function
+
   def install_args
     Homebrew::CLI::Parser.new do
       usage_banner <<~EOS
@@ -255,17 +256,17 @@ module Homebrew
 
     return if formulae.empty?
 
-    Install.perform_preinstall_checks
+    perform_preinstall_checks
 
     formulae.each do |f|
-      Migrator.migrate_if_needed(f)
+      Migrator.migrate_if_needed(f, force: args.force?)
       install_formula(f)
       Cleanup.install_formula_clean!(f)
     end
 
     check_installed_dependents(args: args)
 
-    Homebrew.messages.display_messages
+    Homebrew.messages.display_messages(display_times: args.display_times?)
   rescue FormulaUnreadableError, FormulaClassUnavailableError,
          TapFormulaUnreadableError, TapFormulaClassUnavailableError => e
     # Need to rescue before `FormulaUnavailableError` (superclass of this)
diff --git a/Library/Homebrew/cmd/migrate.rb b/Library/Homebrew/cmd/migrate.rb
index 55dde865132e6a15c4f13da1fa333c31b3c8f3cf..a9d3619543ad371e3844aa282fd44fca267df4f3 100644
--- a/Library/Homebrew/cmd/migrate.rb
+++ b/Library/Homebrew/cmd/migrate.rb
@@ -24,7 +24,7 @@ module Homebrew
   end
 
   def migrate
-    migrate_args.parse
+    args = migrate_args.parse
 
     args.resolved_formulae.each do |f|
       if f.oldname
@@ -34,7 +34,7 @@ module Homebrew
         raise "#{rack} is a symlink" if rack.symlink?
       end
 
-      migrator = Migrator.new(f)
+      migrator = Migrator.new(f, force: args.force?)
       migrator.migrate
     end
   end
diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb
index 2aca9cb7cd82824358ebf5d2dce65ca0f9f278dc..8b32398e92b11dc56eabefa6def1163dcd1d4c0f 100644
--- a/Library/Homebrew/cmd/reinstall.rb
+++ b/Library/Homebrew/cmd/reinstall.rb
@@ -3,6 +3,7 @@
 require "formula_installer"
 require "development_tools"
 require "messages"
+require "install"
 require "reinstall"
 require "cli/parser"
 require "cleanup"
@@ -12,6 +13,8 @@ require "cask/macos"
 require "upgrade"
 
 module Homebrew
+  extend Install
+
   module_function
 
   def reinstall_args
@@ -58,7 +61,7 @@ module Homebrew
 
     FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
 
-    Install.perform_preinstall_checks
+    perform_preinstall_checks
 
     resolved_formulae, casks = args.resolved_formulae_casks
     resolved_formulae.each do |f|
@@ -66,14 +69,14 @@ module Homebrew
         onoe "#{f.full_name} is pinned. You must unpin it to reinstall."
         next
       end
-      Migrator.migrate_if_needed(f)
+      Migrator.migrate_if_needed(f, force: args.force?)
       reinstall_formula(f, args: args)
       Cleanup.install_formula_clean!(f)
     end
 
     check_installed_dependents(args: args)
 
-    Homebrew.messages.display_messages
+    Homebrew.messages.display_messages(display_times: args.display_times?)
 
     return if casks.blank?
 
diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb
index 587af6639293b1d9b8af9e379b179710b06716a2..c9127e81d8948699c6ff26494ae25c938e49dc12 100644
--- a/Library/Homebrew/cmd/update-report.rb
+++ b/Library/Homebrew/cmd/update-report.rb
@@ -38,7 +38,7 @@ module Homebrew
   end
 
   def update_report
-    update_report_args.parse
+    args = update_report_args.parse
 
     if !Utils::Analytics.messages_displayed? &&
        !Utils::Analytics.disabled? &&
@@ -122,7 +122,7 @@ module Homebrew
       else
         hub.dump(updated_formula_report: !args.preinstall?)
         hub.reporters.each(&:migrate_tap_migration)
-        hub.reporters.each(&:migrate_formula_rename)
+        hub.reporters.each { |r| r.migrate_formula_rename(force: args.force?) }
         CacheStoreDatabase.use(:descriptions) do |db|
           DescriptionCacheStore.new(db)
                                .update_from_report!(hub)
@@ -373,7 +373,7 @@ class Reporter
     end
   end
 
-  def migrate_formula_rename
+  def migrate_formula_rename(force:)
     Formula.installed.each do |formula|
       next unless Migrator.needs_migration?(formula)
 
@@ -397,7 +397,7 @@ class Reporter
         next
       end
 
-      Migrator.migrate_if_needed(f)
+      Migrator.migrate_if_needed(f, force: force)
     end
   end
 
diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb
index 8eccc812b4451d7d7ab15fc43436cf56059b1a1a..0b50f13034624e1ffacaaf810ab78ea59c779fa8 100644
--- a/Library/Homebrew/cmd/upgrade.rb
+++ b/Library/Homebrew/cmd/upgrade.rb
@@ -9,6 +9,8 @@ require "cask/utils"
 require "cask/macos"
 
 module Homebrew
+  extend Install
+
   module_function
 
   def upgrade_args
@@ -77,7 +79,7 @@ module Homebrew
   def upgrade_outdated_formulae(formulae)
     FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
 
-    Install.perform_preinstall_checks
+    perform_preinstall_checks
 
     if formulae.blank?
       outdated = Formula.installed.select do |f|
@@ -129,7 +131,7 @@ module Homebrew
 
     check_installed_dependents(args: args)
 
-    Homebrew.messages.display_messages
+    Homebrew.messages.display_messages(display_times: args.display_times?)
   end
 
   def upgrade_outdated_casks(casks)
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index c07d59b97693e941b1365489fddf4dde5ec035b5..b06c788d831aef598619655f83af66198231f2fa 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -21,6 +21,7 @@ require "cmd/install"
 require "find"
 
 class FormulaInstaller
+  include Homebrew::Install
   include FormulaCellarChecks
   extend Predicable
 
@@ -239,9 +240,7 @@ class FormulaInstaller
     lock
 
     start_time = Time.now
-    if !formula.bottle_unneeded? && !pour_bottle? && DevelopmentTools.installed?
-      Homebrew::Install.perform_build_from_source_checks
-    end
+    perform_build_from_source_checks if !formula.bottle_unneeded? && !pour_bottle? && DevelopmentTools.installed?
 
     # not in initialize so upgrade can unlink the active keg before calling this
     # function but after instantiating this class so that it can avoid having to
diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb
index f68572df0845d3d02c7a7a159676fd62e9a183de..a6bd00b252832a3bd7bea9779c662695c75f8dd9 100644
--- a/Library/Homebrew/install.rb
+++ b/Library/Homebrew/install.rb
@@ -7,8 +7,6 @@ require "development_tools"
 
 module Homebrew
   module Install
-    module_function
-
     def check_cpu
       return if Hardware::CPU.intel? && Hardware::CPU.is_64_bit?
 
@@ -40,11 +38,11 @@ module Homebrew
     end
 
     def check_cc_argv
-      return unless Homebrew.args.cc
+      return unless (cc = args.cc)
 
       @checks ||= Diagnostic::Checks.new
       opoo <<~EOS
-        You passed `--cc=#{Homebrew.args.cc}`.
+        You passed `--cc=#{cc}`.
         #{@checks.please_create_pull_requests}
       EOS
     end
diff --git a/Library/Homebrew/messages.rb b/Library/Homebrew/messages.rb
index d0b371a2ec7b764a5e65a8ebfa1d4cdbc28e8419..18187a84472995e23f351a04ed86ce3cc5aa125f 100644
--- a/Library/Homebrew/messages.rb
+++ b/Library/Homebrew/messages.rb
@@ -20,9 +20,9 @@ class Messages
     @install_times.push(formula: f.name, time: elapsed_time)
   end
 
-  def display_messages
+  def display_messages(display_times: false)
     display_caveats
-    display_install_times if Homebrew.args.display_times?
+    display_install_times if display_times
   end
 
   def display_caveats
diff --git a/Library/Homebrew/migrator.rb b/Library/Homebrew/migrator.rb
index 3329e164bc988560c751b8b13bd5c3c1d4977e87..30d0603b0e25d816c5bc28ee6d06cfe35de8ea52 100644
--- a/Library/Homebrew/migrator.rb
+++ b/Library/Homebrew/migrator.rb
@@ -97,18 +97,18 @@ class Migrator
     true
   end
 
-  def self.migrate_if_needed(formula)
+  def self.migrate_if_needed(formula, force:)
     return unless Migrator.needs_migration?(formula)
 
     begin
-      migrator = Migrator.new(formula)
+      migrator = Migrator.new(formula, force: force)
       migrator.migrate
     rescue => e
       onoe e
     end
   end
 
-  def initialize(formula, force: Homebrew.args.force?)
+  def initialize(formula, force: false)
     @oldname = formula.oldname
     @newname = formula.name
     raise MigratorNoOldnameError, formula unless oldname
diff --git a/Library/Homebrew/test/messages_spec.rb b/Library/Homebrew/test/messages_spec.rb
index 9bf48c58aaaa7855e89fc4fa55adfa074bcdff31..fa97096d12e9b35eeb9d8d5aaa3f3f8596d2973f 100644
--- a/Library/Homebrew/test/messages_spec.rb
+++ b/Library/Homebrew/test/messages_spec.rb
@@ -72,27 +72,20 @@ describe Messages do
       end
     end
 
-    # Homebrew.args OpenStruct usage cannot use verified doubles.
-    # rubocop:disable RSpec/VerifiedDoubles
-    context "when the --display-times argument is present" do
-      before do
-        allow(Homebrew).to receive(:args).and_return \
-          double(display_times?: true, flags_only: ["--display-times"])
-      end
-
-      context "when install_times is empty" do
-        it "doesn't print any output" do
-          expect { messages.display_messages }.not_to output.to_stdout
+    context "when the `display_times` argument is true" do
+      context "when `install_times` is empty" do
+        it "doesn't print anything" do
+          expect { messages.display_messages(display_times: true) }.not_to output.to_stdout
         end
       end
 
-      context "when install_times is present" do
+      context "when `install_times` is present" do
         before do
           messages.formula_installed(test_formula, elapsed_time)
         end
 
         it "prints installation times" do
-          expect { messages.display_messages }.to output(
+          expect { messages.display_messages(display_times: true) }.to output(
             <<~EOS,
               ==> Installation times
               foo                       1.100 s
@@ -102,15 +95,10 @@ describe Messages do
       end
     end
 
-    context "when the --display-times argument isn't present" do
-      before do
-        allow(Homebrew).to receive(:args).and_return(double(display_times?: false))
-      end
-
+    context "when the `display_times` argument isn't specified" do
       it "doesn't print installation times" do
         expect { messages.display_messages }.not_to output.to_stdout
       end
     end
-    # rubocop:enable RSpec/VerifiedDoubles
   end
 end
diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb
index 2e4ccb8d58e28ace866aa037d7bfe005ed81ea4f..3a9a211129825d37123f63c9f43d5906347b29cc 100644
--- a/Library/Homebrew/upgrade.rb
+++ b/Library/Homebrew/upgrade.rb
@@ -26,7 +26,7 @@ module Homebrew
     end
 
     formulae_to_install.each do |f|
-      Migrator.migrate_if_needed(f)
+      Migrator.migrate_if_needed(f, force: args.force?)
       begin
         upgrade_formula(f, args: args)
         Cleanup.install_formula_clean!(f)