diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,12 @@
 # Change Log / Release Notes
 
-## 0.17.1 (September 3, 2021)
+## 0.17.2 (April 2, 2023)
+
+### Bug Fixes
+
+  * Fixed the build with GHC 9.6.
+
+## 0.17.1 (September 3, 2022)
 
 ### Enhancements
 
diff --git a/INSTALL.md b/INSTALL.md
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -101,7 +101,7 @@
 out a tagged release, e.g.:
 
 ``` console
-$ git clone --branch v0.17.1 https://github.com/xmonad/xmonad
+$ git clone --branch v0.17.2 https://github.com/xmonad/xmonad
 $ git clone --branch v0.17.1 https://github.com/xmonad/xmonad-contrib
 ```
 
diff --git a/man/xmonad.1 b/man/xmonad.1
--- a/man/xmonad.1
+++ b/man/xmonad.1
@@ -1,10 +1,10 @@
-.\" Automatically generated by Pandoc 2.5
+.\" Automatically generated by Pandoc 2.9.2.1
 .\"
 .TH "XMONAD" "1" "27 October 2021" "Tiling Window Manager" ""
 .hy
 .SH Name
 .PP
-xmonad \- Tiling Window Manager
+xmonad - Tiling Window Manager
 .SH Description
 .PP
 \f[I]xmonad\f[R] is a minimalist tiling window manager for X, written in
@@ -36,27 +36,27 @@
 emphasis on correctness and robustness.
 Internal properties of the window manager are checked using a
 combination of static guarantees provided by the type system, and
-type\-based automated testing.
+type-based automated testing.
 A benefit of this is that the code is simple to understand, and easy to
 modify.
 .SH Usage
 .PP
 \f[I]xmonad\f[R] places each window into a \[lq]workspace\[rq].
 Each workspace can have any number of windows, which you can cycle
-though with mod\-j and mod\-k.
+though with mod-j and mod-k.
 Windows are either displayed full screen, tiled horizontally, or tiled
 vertically.
-You can toggle the layout mode with mod\-space, which will cycle through
+You can toggle the layout mode with mod-space, which will cycle through
 the available modes.
 .PP
-You can switch to workspace N with mod\-N.
-For example, to switch to workspace 5, you would press mod\-5.
+You can switch to workspace N with mod-N.
+For example, to switch to workspace 5, you would press mod-5.
 Similarly, you can move the current window to another workspace with
-mod\-shift\-N.
+mod-shift-N.
 .PP
 When running with multiple monitors (Xinerama), each screen has exactly
 1 workspace visible.
-mod\-{w,e,r} switch the focus between screens, while shift\-mod\-{w,e,r}
+mod-{w,e,r} switch the focus between screens, while shift-mod-{w,e,r}
 move the current window to that screen.
 When \f[I]xmonad\f[R] starts, workspace 1 is on screen 1, workspace 2 is
 on screen 2, etc.
@@ -67,115 +67,115 @@
 xmonad has several flags which you may pass to the executable.
 These flags are:
 .TP
-.B \[en]recompile
+\[en]recompile
 Recompiles your \f[I]xmonad.hs\f[R] configuration
 .TP
-.B \[en]restart
+\[en]restart
 Causes the currently running \f[I]xmonad\f[R] process to restart
 .TP
-.B \[en]replace
+\[en]replace
 Replace the current window manager with xmonad
 .TP
-.B \[en]version
+\[en]version
 Display version of \f[I]xmonad\f[R]
 .TP
-.B \[en]verbose\-version
+\[en]verbose-version
 Display detailed version of \f[I]xmonad\f[R]
 .SS Default keyboard bindings
 .TP
-.B mod\-shift\-return
+mod-shift-return
 Launch terminal
 .TP
-.B mod\-p
+mod-p
 Launch dmenu
 .TP
-.B mod\-shift\-p
+mod-shift-p
 Launch gmrun
 .TP
-.B mod\-shift\-c
+mod-shift-c
 Close the focused window
 .TP
-.B mod\-space
+mod-space
 Rotate through the available layout algorithms
 .TP
-.B mod\-shift\-space
+mod-shift-space
 Reset the layouts on the current workspace to default
 .TP
-.B mod\-n
+mod-n
 Resize viewed windows to the correct size
 .TP
-.B mod\-tab
+mod-tab
 Move focus to the next window
 .TP
-.B mod\-shift\-tab
+mod-shift-tab
 Move focus to the previous window
 .TP
-.B mod\-j
+mod-j
 Move focus to the next window
 .TP
-.B mod\-k
+mod-k
 Move focus to the previous window
 .TP
-.B mod\-m
+mod-m
 Move focus to the master window
 .TP
-.B mod\-return
+mod-return
 Swap the focused window and the master window
 .TP
-.B mod\-shift\-j
+mod-shift-j
 Swap the focused window with the next window
 .TP
-.B mod\-shift\-k
+mod-shift-k
 Swap the focused window with the previous window
 .TP
-.B mod\-h
+mod-h
 Shrink the master area
 .TP
-.B mod\-l
+mod-l
 Expand the master area
 .TP
-.B mod\-t
+mod-t
 Push window back into tiling
 .TP
-.B mod\-comma
+mod-comma
 Increment the number of windows in the master area
 .TP
-.B mod\-period
+mod-period
 Deincrement the number of windows in the master area
 .TP
-.B mod\-shift\-q
+mod-shift-q
 Quit xmonad
 .TP
-.B mod\-q
+mod-q
 Restart xmonad
 .TP
-.B mod\-shift\-slash
+mod-shift-slash
 Run xmessage with a summary of the default keybindings (useful for
 beginners)
 .TP
-.B mod\-question
+mod-question
 Run xmessage with a summary of the default keybindings (useful for
 beginners)
 .TP
-.B mod\-[1..9]
+mod-[1..9]
 Switch to workspace N
 .TP
-.B mod\-shift\-[1..9]
+mod-shift-[1..9]
 Move client to workspace N
 .TP
-.B mod\-{w,e,r}
+mod-{w,e,r}
 Switch to physical/Xinerama screens 1, 2, or 3
 .TP
-.B mod\-shift\-{w,e,r}
+mod-shift-{w,e,r}
 Move client to screen 1, 2, or 3
 .TP
-.B mod\-button1
+mod-button1
 Set the window to floating mode and move by dragging
 .TP
-.B mod\-button2
+mod-button2
 Raise the window to the top of the stack
 .TP
-.B mod\-button3
+mod-button3
 Set the window to floating mode and resize by dragging
 .SH Examples
 .PP
@@ -188,7 +188,7 @@
 .SH Customization
 .PP
 xmonad is customized in your \f[I]xmonad.hs\f[R], and then restarted
-with mod\-q.
+with mod-q.
 You can choose where your configuration file lives by
 .IP "1." 3
 Setting \f[C]XMONAD_DATA_DIR,\f[R] \f[C]XMONAD_CONFIG_DIR\f[R], and
@@ -201,14 +201,13 @@
 Note that, in this case, xmonad will use \f[C]XDG_DATA_HOME\f[R] and
 \f[C]XDG_CACHE_HOME\f[R] for its data and cache directory respectively.
 .PP
-You can find many extensions to the core feature set in the xmonad\-
+You can find many extensions to the core feature set in the xmonad-
 contrib package, available through your package manager or from
 xmonad.org (https://xmonad.org).
 .SS Modular Configuration
 .PP
-As of \f[I]xmonad\-0.9\f[R], any additional Haskell modules may be
-placed in \f[I]\[ti]/.xmonad/lib/\f[R] are available in GHC\[cq]s
-searchpath.
+As of \f[I]xmonad-0.9\f[R], any additional Haskell modules may be placed
+in \f[I]\[ti]/.xmonad/lib/\f[R] are available in GHC\[cq]s searchpath.
 Hierarchical modules are supported: for example, the file
 \f[I]\[ti]/.xmonad/lib/XMonad/Stack/MyAdditions.hs\f[R] could contain:
 .IP
@@ -220,7 +219,7 @@
 .fi
 .PP
 Your xmonad.hs may then import XMonad.Stack.MyAdditions as if that
-module was contained within xmonad or xmonad\-contrib.
+module was contained within xmonad or xmonad-contrib.
 .SH Bugs
 .PP
 Probably.
diff --git a/man/xmonad.1.html b/man/xmonad.1.html
--- a/man/xmonad.1.html
+++ b/man/xmonad.1.html
@@ -7,74 +7,75 @@
   <meta name="author" content="" />
   <meta name="dcterms.date" content="2021-10-27" />
   <title>XMONAD(1) Tiling Window Manager</title>
-  <style type="text/css">
-      code{white-space: pre-wrap;}
-      span.smallcaps{font-variant: small-caps;}
-      span.underline{text-decoration: underline;}
-      div.column{display: inline-block; vertical-align: top; width: 50%;}
-  </style>
-  <style type="text/css">
-a.sourceLine { display: inline-block; line-height: 1.25; }
-a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
-a.sourceLine:empty { height: 1.2em; }
-.sourceCode { overflow: visible; }
-code.sourceCode { white-space: pre; position: relative; }
-div.sourceCode { margin: 1em 0; }
-pre.sourceCode { margin: 0; }
-@media screen {
-div.sourceCode { overflow: auto; }
-}
-@media print {
-code.sourceCode { white-space: pre-wrap; }
-a.sourceLine { text-indent: -1em; padding-left: 1em; }
-}
-pre.numberSource a.sourceLine
-  { position: relative; left: -4em; }
-pre.numberSource a.sourceLine::before
-  { content: attr(title);
-    position: relative; left: -1em; text-align: right; vertical-align: baseline;
-    border: none; pointer-events: all; display: inline-block;
-    -webkit-touch-callout: none; -webkit-user-select: none;
-    -khtml-user-select: none; -moz-user-select: none;
-    -ms-user-select: none; user-select: none;
-    padding: 0 4px; width: 4em;
-    color: #aaaaaa;
-  }
-pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
-div.sourceCode
-  {  }
-@media screen {
-a.sourceLine::before { text-decoration: underline; }
-}
-code span.al { color: #ff0000; font-weight: bold; } /* Alert */
-code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
-code span.at { color: #7d9029; } /* Attribute */
-code span.bn { color: #40a070; } /* BaseN */
-code span.bu { } /* BuiltIn */
-code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
-code span.ch { color: #4070a0; } /* Char */
-code span.cn { color: #880000; } /* Constant */
-code span.co { color: #60a0b0; font-style: italic; } /* Comment */
-code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
-code span.do { color: #ba2121; font-style: italic; } /* Documentation */
-code span.dt { color: #902000; } /* DataType */
-code span.dv { color: #40a070; } /* DecVal */
-code span.er { color: #ff0000; font-weight: bold; } /* Error */
-code span.ex { } /* Extension */
-code span.fl { color: #40a070; } /* Float */
-code span.fu { color: #06287e; } /* Function */
-code span.im { } /* Import */
-code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
-code span.kw { color: #007020; font-weight: bold; } /* Keyword */
-code span.op { color: #666666; } /* Operator */
-code span.ot { color: #007020; } /* Other */
-code span.pp { color: #bc7a00; } /* Preprocessor */
-code span.sc { color: #4070a0; } /* SpecialChar */
-code span.ss { color: #bb6688; } /* SpecialString */
-code span.st { color: #4070a0; } /* String */
-code span.va { color: #19177c; } /* Variable */
-code span.vs { color: #4070a0; } /* VerbatimString */
-code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+  <style>
+    code{white-space: pre-wrap;}
+    span.smallcaps{font-variant: small-caps;}
+    span.underline{text-decoration: underline;}
+    div.column{display: inline-block; vertical-align: top; width: 50%;}
+    div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
+    ul.task-list{list-style: none;}
+    pre > code.sourceCode { white-space: pre; position: relative; }
+    pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
+    pre > code.sourceCode > span:empty { height: 1.2em; }
+    code.sourceCode > span { color: inherit; text-decoration: inherit; }
+    div.sourceCode { margin: 1em 0; }
+    pre.sourceCode { margin: 0; }
+    @media screen {
+    div.sourceCode { overflow: auto; }
+    }
+    @media print {
+    pre > code.sourceCode { white-space: pre-wrap; }
+    pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
+    }
+    pre.numberSource code
+      { counter-reset: source-line 0; }
+    pre.numberSource code > span
+      { position: relative; left: -4em; counter-increment: source-line; }
+    pre.numberSource code > span > a:first-child::before
+      { content: counter(source-line);
+        position: relative; left: -1em; text-align: right; vertical-align: baseline;
+        border: none; display: inline-block;
+        -webkit-touch-callout: none; -webkit-user-select: none;
+        -khtml-user-select: none; -moz-user-select: none;
+        -ms-user-select: none; user-select: none;
+        padding: 0 4px; width: 4em;
+        color: #aaaaaa;
+      }
+    pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
+    div.sourceCode
+      {   }
+    @media screen {
+    pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
+    }
+    code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+    code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+    code span.at { color: #7d9029; } /* Attribute */
+    code span.bn { color: #40a070; } /* BaseN */
+    code span.bu { } /* BuiltIn */
+    code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+    code span.ch { color: #4070a0; } /* Char */
+    code span.cn { color: #880000; } /* Constant */
+    code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+    code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+    code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+    code span.dt { color: #902000; } /* DataType */
+    code span.dv { color: #40a070; } /* DecVal */
+    code span.er { color: #ff0000; font-weight: bold; } /* Error */
+    code span.ex { } /* Extension */
+    code span.fl { color: #40a070; } /* Float */
+    code span.fu { color: #06287e; } /* Function */
+    code span.im { } /* Import */
+    code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+    code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+    code span.op { color: #666666; } /* Operator */
+    code span.ot { color: #007020; } /* Other */
+    code span.pp { color: #bc7a00; } /* Preprocessor */
+    code span.sc { color: #4070a0; } /* SpecialChar */
+    code span.ss { color: #bb6688; } /* SpecialString */
+    code span.st { color: #4070a0; } /* String */
+    code span.va { color: #19177c; } /* Variable */
+    code span.vs { color: #4070a0; } /* VerbatimString */
+    code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
   </style>
 </head>
 <body>
@@ -83,16 +84,18 @@
 <p class="author"></p>
 <p class="date">27 October 2021</p>
 </header>
-<nav id="TOC">
+<nav id="TOC" role="doc-toc">
 <ul>
 <li><a href="#name">Name</a></li>
 <li><a href="#description">Description</a></li>
-<li><a href="#usage">Usage</a><ul>
+<li><a href="#usage">Usage</a>
+<ul>
 <li><a href="#flags">Flags</a></li>
 <li><a href="#default-keyboard-bindings">Default keyboard bindings</a></li>
 </ul></li>
 <li><a href="#examples">Examples</a></li>
-<li><a href="#customization">Customization</a><ul>
+<li><a href="#customization">Customization</a>
+<ul>
 <li><a href="#modular-configuration">Modular Configuration</a></li>
 </ul></li>
 <li><a href="#bugs">Bugs</a></li>
@@ -238,8 +241,8 @@
 <p>You can find many extensions to the core feature set in the xmonad- contrib package, available through your package manager or from <a href="https://xmonad.org">xmonad.org</a>.</p>
 <h2 id="modular-configuration">Modular Configuration</h2>
 <p>As of <em>xmonad-0.9</em>, any additional Haskell modules may be placed in <em>~/.xmonad/lib/</em> are available in GHC’s searchpath. Hierarchical modules are supported: for example, the file <em>~/.xmonad/lib/XMonad/Stack/MyAdditions.hs</em> could contain:</p>
-<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">module</span> <span class="dt">XMonad.Stack.MyAdditions</span> (function1) <span class="kw">where</span></a>
-<a class="sourceLine" id="cb1-2" title="2">  function1 <span class="ot">=</span> <span class="fu">error</span> <span class="st">&quot;function1: Not implemented yet!&quot;</span></a></code></pre></div>
+<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true"></a><span class="kw">module</span> <span class="dt">XMonad.Stack.MyAdditions</span> (function1) <span class="kw">where</span></span>
+<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a>  function1 <span class="ot">=</span> <span class="fu">error</span> <span class="st">&quot;function1: Not implemented yet!&quot;</span></span></code></pre></div>
 <p>Your xmonad.hs may then import XMonad.Stack.MyAdditions as if that module was contained within xmonad or xmonad-contrib.</p>
 <h1 id="bugs">Bugs</h1>
 <p>Probably. If you find any, please report them to the <a href="https://github.com/xmonad/xmonad/issues">bugtracker</a></p>
diff --git a/src/XMonad/Config.hs b/src/XMonad/Config.hs
--- a/src/XMonad/Config.hs
+++ b/src/XMonad/Config.hs
@@ -1,5 +1,6 @@
 {-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-orphans #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  XMonad.Config
diff --git a/src/XMonad/Core.hs b/src/XMonad/Core.hs
--- a/src/XMonad/Core.hs
+++ b/src/XMonad/Core.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveTraversable #-}
 {-# LANGUAGE ExistentialQuantification #-}
 {-# LANGUAGE FlexibleInstances #-}
@@ -44,9 +45,10 @@
 import qualified Control.Exception as E
 import Control.Applicative ((<|>), empty)
 import Control.Monad.Fail
+import Control.Monad.Fix (fix)
 import Control.Monad.State
 import Control.Monad.Reader
-import Control.Monad (void)
+import Control.Monad (filterM, guard, liftM2, void, when)
 import Data.Semigroup
 import Data.Traversable (for)
 import Data.Time.Clock (UTCTime)
@@ -451,7 +453,11 @@
                 x
  where
     nullStdin = do
+#if MIN_VERSION_unix(2,8,0)
+        fd <- openFd "/dev/null" ReadOnly defaultFileFlags
+#else
         fd <- openFd "/dev/null" ReadOnly Nothing defaultFileFlags
+#endif
         dupTo fd stdInput
         closeFd fd
 
diff --git a/src/XMonad/Main.hs b/src/XMonad/Main.hs
--- a/src/XMonad/Main.hs
+++ b/src/XMonad/Main.hs
@@ -27,6 +27,7 @@
 import qualified Data.Set as S
 import Control.Monad.Reader
 import Control.Monad.State
+import Control.Monad (filterM, guard, unless, void, when)
 import Data.Maybe (fromMaybe, isJust)
 import Data.Monoid (getAll)
 
diff --git a/src/XMonad/Operations.hs b/src/XMonad/Operations.hs
--- a/src/XMonad/Operations.hs
+++ b/src/XMonad/Operations.hs
@@ -70,9 +70,10 @@
 import qualified Data.Set as S
 
 import Control.Arrow (second)
+import Control.Monad.Fix (fix)
 import Control.Monad.Reader
 import Control.Monad.State
-import Control.Monad (void)
+import Control.Monad (forM, forM_, guard, join, unless, void, when)
 import qualified Control.Exception as C
 
 import System.IO
diff --git a/tests/Properties/Stack.hs b/tests/Properties/Stack.hs
--- a/tests/Properties/Stack.hs
+++ b/tests/Properties/Stack.hs
@@ -1,9 +1,5 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-
-#ifdef VERSION_quickcheck_classes
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-#endif
 
 module Properties.Stack where
 
@@ -15,13 +11,11 @@
 
 import Data.Maybe
 
-#ifdef VERSION_quickcheck_classes
 import Data.Proxy
 import Test.QuickCheck.Classes (
     Laws (lawsTypeclass, lawsProperties), Proxy1 (Proxy1),
     foldableLaws, traversableLaws,
     )
-#endif
 
 
 -- The list returned by index should be the same length as the actual
@@ -65,7 +59,6 @@
     where _ = xs :: [Int]
 
 
-#ifdef VERSION_quickcheck_classes
 -- Check type class laws of 'Data.Foldable.Foldable' and 'Data.Traversable.Traversable'.
 newtype TestStack a = TestStack (Stack a)
     deriving (Eq, Read, Show, Foldable, Functor)
@@ -82,6 +75,3 @@
     p = Proxy :: Proxy TestStack
     format laws = [ ("Stack: " <> lawsTypeclass laws <> ": " <> name, prop)
                   | (name, prop) <- lawsProperties laws ]
-#else
-prop_laws_Stack = []
-#endif
diff --git a/xmonad.cabal b/xmonad.cabal
--- a/xmonad.cabal
+++ b/xmonad.cabal
@@ -1,5 +1,5 @@
 name:               xmonad
-version:            0.17.1
+version:            0.17.2
 synopsis:           A tiling window manager
 description:        xmonad is a tiling window manager for X. Windows are arranged
                     automatically to tile the screen without gaps or overlap, maximising
@@ -27,7 +27,7 @@
                     Ondřej Súkup, Paul Hebble, Shachaf Ben-Kiki, Siim Põder, Tim McIver,
                     Trevor Elliott, Wouter Swierstra, Conrad Irwin, Tim Thelion, Tony Zorman
 maintainer:         xmonad@haskell.org
-tested-with:        GHC == 8.4.4 || == 8.6.5 || == 8.8.4 || == 8.10.7 || == 9.0.2 || == 9.2.2
+tested-with:        GHC == 8.6.5 || == 8.8.4 || == 8.10.7 || == 9.0.2 || == 9.2.7 || == 9.4.4 || == 9.6.1
 category:           System
 homepage:           http://xmonad.org
 bug-reports:        https://github.com/xmonad/xmonad/issues
@@ -54,8 +54,6 @@
   default:     False
   manual:      True
 
-flag quickcheck-classes
-
 library
   exposed-modules: XMonad
                    XMonad.Config
@@ -83,7 +81,7 @@
   default-language: Haskell2010
 
   -- Keep this in sync with the oldest version in 'tested-with'
-  if impl(ghc > 8.4.4)
+  if impl(ghc > 8.6.5)
     ghc-options:   -Wno-unused-imports
 
   if flag(pedantic)
@@ -96,7 +94,7 @@
   default-language: Haskell2010
 
   -- Keep this in sync with the oldest version in 'tested-with'
-  if impl(ghc > 8.4.4)
+  if impl(ghc > 8.6.5)
     ghc-options:   -Wno-unused-imports
 
   if flag(pedantic)
@@ -125,15 +123,11 @@
   hs-source-dirs: tests
   build-depends:  base
                 , QuickCheck >= 2
+                , quickcheck-classes >= 0.4.3
                 , X11
                 , containers
                 , xmonad
   default-language: Haskell2010
-
-  if flag(quickcheck-classes) && impl(ghc > 8.5)
-    -- no quickcheck-classes in LTS-12
-    -- GHC 8.4 and lower needs too much boilerplate (Eq1, Show1, …)
-    build-depends: quickcheck-classes >= 0.4.3
 
   if flag(pedantic)
     ghc-options:   -Werror
