diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
index 7ce6153ba5..5887cc2435 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
@@ -30,8 +30,8 @@ namespace osu.Game.Tests.Visual.Gameplay
             AddAssert("showhud is set", () => hudOverlay.ShowHud.Value);
 
             AddAssert("hidetarget is visible", () => hideTarget.IsPresent);
-            AddAssert("key counter flow is visible", () => hudOverlay.KeyCounter.KeyFlow.IsPresent);
             AddAssert("pause button is visible", () => hudOverlay.HoldToQuit.IsPresent);
+            AddAssert("key counter flow is hidden", () => !hudOverlay.KeyCounter.KeyFlow.IsPresent);
         }
 
         [Test]
@@ -45,17 +45,19 @@ namespace osu.Game.Tests.Visual.Gameplay
         }
 
         [Test]
-        public void TestHideExternally()
+        public void TestChangeVisibilityExternally()
         {
             createNew();
 
             AddStep("set showhud false", () => hudOverlay.ShowHud.Value = false);
-
             AddUntilStep("hidetarget is hidden", () => !hideTarget.IsPresent);
+            AddAssert("key counter flow is hidden", () => !hudOverlay.KeyCounter.KeyFlow.IsPresent);
             AddAssert("pause button is still visible", () => hudOverlay.HoldToQuit.IsPresent);
 
-            // Key counter flow container should not be affected by this, only the key counter display will be hidden as checked above.
-            AddAssert("key counter flow not affected", () => hudOverlay.KeyCounter.KeyFlow.IsPresent);
+            AddStep("set showhud false", () => hudOverlay.ShowHud.Value = true);
+            AddUntilStep("hidetarget is visible", () => hideTarget.IsPresent);
+            AddAssert("key counter flow is still hidden", () => !hudOverlay.KeyCounter.KeyFlow.IsPresent);
+            AddAssert("pause button is still visible", () => hudOverlay.HoldToQuit.IsPresent);
         }
 
         [Test]
@@ -82,11 +84,7 @@ namespace osu.Game.Tests.Visual.Gameplay
             createNew();
             AddStep("save keycounter visible value", () => keyCounterVisibleValue = config.Get<bool>(OsuSetting.KeyOverlay));
 
-            AddStep("set keycounter visible false", () =>
-            {
-                config.Set<bool>(OsuSetting.KeyOverlay, false);
-                hudOverlay.KeyCounter.Visible.Value = false;
-            });
+            AddStep("set keycounter visible false", () => config.Set<bool>(OsuSetting.KeyOverlay, false));
 
             AddStep("set showhud false", () => hudOverlay.ShowHud.Value = false);
             AddUntilStep("hidetarget is hidden", () => !hideTarget.IsPresent);
diff --git a/osu.Game/Screens/Play/KeyCounterDisplay.cs b/osu.Game/Screens/Play/KeyCounterDisplay.cs
index b5d8c99e67..4c4fcea879 100644
--- a/osu.Game/Screens/Play/KeyCounterDisplay.cs
+++ b/osu.Game/Screens/Play/KeyCounterDisplay.cs
@@ -20,12 +20,12 @@ namespace osu.Game.Screens.Play
         private const double key_fade_time = 80;
 
         /// <summary>
-        /// Whether to always show key counter regardless of <see cref="Visible"/>.
+        /// Whether to always show key counter regardless of any other condition.
         /// This is bound to <see cref="OsuSetting.KeyOverlay"/> configuration setting bindable.
         /// </summary>
         private readonly Bindable<bool> alwaysShow = new Bindable<bool>();
 
-        public readonly Bindable<bool> Visible = new Bindable<bool>(true);
+        public readonly Bindable<bool> HasReplayLoaded = new BindableBool();
 
         protected readonly FillFlowContainer<KeyCounter> KeyFlow;
 
@@ -63,7 +63,7 @@ namespace osu.Game.Screens.Play
         {
             base.LoadComplete();
 
-            Visible.BindValueChanged(_ => updateVisibility());
+            HasReplayLoaded.BindValueChanged(_ => updateVisibility());
             alwaysShow.BindValueChanged(_ => updateVisibility(), true);
         }
 
@@ -116,7 +116,7 @@ namespace osu.Game.Screens.Play
 
         private void updateVisibility() =>
             // Isolate changing visibility of the key counters from fading this component.
-            KeyFlow.FadeTo(Visible.Value || alwaysShow.Value ? 1 : 0, duration);
+            KeyFlow.FadeTo(HasReplayLoaded.Value || alwaysShow.Value ? 1 : 0, duration);
 
         public override bool HandleNonPositionalInput => receptor == null;
         public override bool HandlePositionalInput => receptor == null;
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 7228e22382..02fc5f81d5 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -219,7 +219,7 @@ namespace osu.Game.Screens.Play
                         IsPaused = { BindTarget = GameplayClockContainer.IsPaused }
                     },
                     PlayerSettingsOverlay = { PlaybackSettings = { UserPlaybackRate = { BindTarget = GameplayClockContainer.UserPlaybackRate } } },
-                    KeyCounter = { Visible = { BindTarget = DrawableRuleset.HasReplayLoaded } },
+                    KeyCounter = { HasReplayLoaded = { BindTarget = DrawableRuleset.HasReplayLoaded } },
                     RequestSeek = GameplayClockContainer.Seek,
                     Anchor = Anchor.Centre,
                     Origin = Anchor.Centre