diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+# 7.4.1
+
+## Fixes
+
+* Show empty workspaces in the default workspaces widget again, as before
+  5.2.0 (#698). Special workspaces remain hidden. Set
+  `showWorkspaceFn = \ws -> hideEmpty ws && not (workspaceIsSpecial ws)` to
+  hide empty workspaces.
+* Hidden workspaces no longer reserve `widgetGap` spacing or wrapper padding.
+
 # 7.4.0
 
 ## Compatibility
diff --git a/src/System/Taffybar/Widget/Workspaces.hs b/src/System/Taffybar/Widget/Workspaces.hs
--- a/src/System/Taffybar/Widget/Workspaces.hs
+++ b/src/System/Taffybar/Widget/Workspaces.hs
@@ -218,7 +218,6 @@
 
 data WorkspaceEntry = WorkspaceEntry
   { entryWrapper :: Gtk.Widget,
-    entryButton :: Gtk.EventBox,
     entryController :: WorkspaceWidgetController,
     entryWorkspaceRef :: IORef WorkspaceInfo,
     entryLastWorkspace :: WorkspaceInfo
@@ -260,7 +259,7 @@
       minIcons = 0,
       getWindowIconPixbuf = defaultGetWindowIconPixbuf,
       labelSetter = return . T.unpack . workspaceName . workspaceIdentity,
-      showWorkspaceFn = \ws -> hideEmpty ws && not (workspaceIsSpecial ws),
+      showWorkspaceFn = not . workspaceIsSpecial,
       iconSort = pure . sortWindowsByPosition,
       hyprlandWorkspaceProviderConfig = defaultHyprlandWorkspaceProviderConfig,
       urgentWorkspaceState = False,
@@ -386,8 +385,8 @@
           && snapshotRevision snapshot /= cacheLastRevision oldCache
       applyVisibility wsInfo entry =
         if showWorkspaceFn cfg wsInfo
-          then liftIO $ Gtk.widgetShow (entryButton entry)
-          else liftIO $ Gtk.widgetHide (entryButton entry)
+          then liftIO $ Gtk.widgetShow (entryWrapper entry)
+          else liftIO $ Gtk.widgetHide (entryWrapper entry)
   if workspaces == cacheLastWorkspaces oldCache && not forceIconRefresh
     then do
       forM_ (M.elems $ cacheEntries oldCache) $ \entry ->
@@ -473,7 +472,6 @@
   return
     WorkspaceEntry
       { entryWrapper = wrapper,
-        entryButton = button,
         entryController = controller,
         entryWorkspaceRef = wsRef,
         entryLastWorkspace = wsInfo
diff --git a/taffybar.cabal b/taffybar.cabal
--- a/taffybar.cabal
+++ b/taffybar.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.4
 name: taffybar
-version: 7.4.0
+version: 7.4.1
 synopsis: A desktop bar similar to xmobar, but with more GUI
 description: Taffybar is a desktop status bar with GTK widgets for window
   manager state, system information, tray icons, and custom user modules.
diff --git a/test/unit/System/Taffybar/Widget/Workspaces/LayoutSpec.hs b/test/unit/System/Taffybar/Widget/Workspaces/LayoutSpec.hs
--- a/test/unit/System/Taffybar/Widget/Workspaces/LayoutSpec.hs
+++ b/test/unit/System/Taffybar/Widget/Workspaces/LayoutSpec.hs
@@ -24,7 +24,16 @@
 import Test.Hspec
 
 spec :: Spec
-spec = aroundAll withXvfb $
+spec = do
+  it "shows empty workspaces but hides special ones by default" $ do
+    let shown = showWorkspaceFn defaultWorkspacesConfig
+        empty = (workspace "5" []) {workspaceState = WorkspaceEmpty}
+    shown empty `shouldBe` True
+    shown empty {workspaceIsSpecial = True} `shouldBe` False
+  layoutSpec
+
+layoutSpec :: Spec
+layoutSpec = aroundAll withXvfb $
   describe "workspace label layout" $
     it "reserves label space and preserves the opt-in overlay" $ \display ->
       setDefaultDisplay_ display $
