diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/goatee-gtk.cabal b/goatee-gtk.cabal
--- a/goatee-gtk.cabal
+++ b/goatee-gtk.cabal
@@ -1,16 +1,16 @@
 name: goatee-gtk
-version: 0.3.1.3
+version: 0.4.0
 synopsis: A monadic take on a 2,500-year-old board game - GTK+ UI.
 category: Game
 license: AGPL-3
 license-file: LICENSE
-copyright: Copyright 2014-2018 Bryan Gardiner
+copyright: Copyright 2014-2021 Bryan Gardiner
 author: Bryan Gardiner <bog@khumba.net>
 maintainer: Bryan Gardiner <bog@khumba.net>
 homepage: http://khumba.net/projects/goatee
 bug-reports: https://savannah.nongnu.org/projects/goatee/
 tested-with: GHC
-cabal-version: >=1.8
+cabal-version: 2.0
 build-type: Simple
 data-files: LICENSE
 description:
@@ -30,19 +30,19 @@
     build-depends:
         base >= 4 && < 5,
         cairo >= 0.13 && < 0.14,
-        containers >= 0.4 && < 0.6,
+        containers >= 0.4 && < 0.7,
         directory >= 1.1 && < 1.4,
         filepath >= 1.3 && < 1.5,
         glib >= 0.13 && < 0.14,
         gtk >= 0.13 && < 0.16,
-        goatee >= 0.3 && < 0.4,
+        goatee >= 0.4 && < 0.5,
         mtl >= 2.1 && < 2.3,
         parsec >= 3.1 && < 3.2
     exposed-modules:
         Game.Goatee.Ui.Gtk
         Game.Goatee.Ui.Gtk.Common
         Game.Goatee.Ui.Gtk.Latch
-    extensions:
+    default-extensions:
         ExistentialQuantification
         FlexibleContexts
         FlexibleInstances
@@ -71,6 +71,9 @@
         Game.Goatee.Ui.Gtk.Utils
         Game.Goatee.Ui.Gtk.Widget
         Paths_goatee_gtk
+    autogen-modules:
+        Paths_goatee_gtk
+    default-language: Haskell2010
 
 executable goatee-gtk
     build-depends:
@@ -80,6 +83,7 @@
     ghc-options: -W -fwarn-incomplete-patterns -fwarn-unused-do-bind
     hs-source-dirs: src-exe
     main-is: Main.hs
+    default-language: Haskell2010
 
 test-suite test-goatee-gtk
     build-depends:
@@ -93,3 +97,4 @@
         Game.Goatee.Ui.Gtk.CommonTest
         Game.Goatee.Ui.Gtk.LatchTest
     type: exitcode-stdio-1.0
+    default-language: Haskell2010
diff --git a/src-exe/Main.hs b/src-exe/Main.hs
--- a/src-exe/Main.hs
+++ b/src-exe/Main.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk.hs b/src/Game/Goatee/Ui/Gtk.hs
--- a/src/Game/Goatee/Ui/Gtk.hs
+++ b/src/Game/Goatee/Ui/Gtk.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -26,9 +26,6 @@
   startFile,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>), Applicative)
-#endif
 import Control.Concurrent.MVar (MVar, newMVar, takeMVar, readMVar, putMVar, modifyMVar, modifyMVar_)
 import Control.Exception (IOException, catch, finally)
 import Control.Monad (forM_, join, liftM, unless, void, when)
diff --git a/src/Game/Goatee/Ui/Gtk/Actions.hs b/src/Game/Goatee/Ui/Gtk/Actions.hs
--- a/src/Game/Goatee/Ui/Gtk/Actions.hs
+++ b/src/Game/Goatee/Ui/Gtk/Actions.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -48,9 +48,6 @@
   myHelpAboutAction,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad (forM, unless, void, when)
 import qualified Data.Foldable as F
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
diff --git a/src/Game/Goatee/Ui/Gtk/Common.hs b/src/Game/Goatee/Ui/Gtk/Common.hs
--- a/src/Game/Goatee/Ui/Gtk/Common.hs
+++ b/src/Game/Goatee/Ui/Gtk/Common.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -58,9 +58,6 @@
   toggle,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>), (<*>), pure)
-#endif
 import Data.IORef (IORef, modifyIORef, newIORef, readIORef, writeIORef)
 import qualified Data.Set as Set
 import Data.Set (Set)
diff --git a/src/Game/Goatee/Ui/Gtk/GamePropertiesPanel.hs b/src/Game/Goatee/Ui/Gtk/GamePropertiesPanel.hs
--- a/src/Game/Goatee/Ui/Gtk/GamePropertiesPanel.hs
+++ b/src/Game/Goatee/Ui/Gtk/GamePropertiesPanel.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk/Goban.hs b/src/Game/Goatee/Ui/Gtk/Goban.hs
--- a/src/Game/Goatee/Ui/Gtk/Goban.hs
+++ b/src/Game/Goatee/Ui/Gtk/Goban.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -25,9 +25,6 @@
   myWidget,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad ((<=<), liftM, unless, void, when)
 import qualified Data.Foldable as F
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
diff --git a/src/Game/Goatee/Ui/Gtk/InfoLine.hs b/src/Game/Goatee/Ui/Gtk/InfoLine.hs
--- a/src/Game/Goatee/Ui/Gtk/InfoLine.hs
+++ b/src/Game/Goatee/Ui/Gtk/InfoLine.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -26,9 +26,6 @@
   myWidget,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Data.Maybe (fromMaybe)
 import Game.Goatee.Lib.Board
 import Game.Goatee.Lib.Monad
diff --git a/src/Game/Goatee/Ui/Gtk/Latch.hs b/src/Game/Goatee/Ui/Gtk/Latch.hs
--- a/src/Game/Goatee/Ui/Gtk/Latch.hs
+++ b/src/Game/Goatee/Ui/Gtk/Latch.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk/MainWindow.hs b/src/Game/Goatee/Ui/Gtk/MainWindow.hs
--- a/src/Game/Goatee/Ui/Gtk/MainWindow.hs
+++ b/src/Game/Goatee/Ui/Gtk/MainWindow.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -26,9 +26,6 @@
   myWindow,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad (forM, forM_, join, liftM)
 import Control.Monad.Trans (liftIO)
 import qualified Data.Foldable as F
diff --git a/src/Game/Goatee/Ui/Gtk/NodePropertiesPanel.hs b/src/Game/Goatee/Ui/Gtk/NodePropertiesPanel.hs
--- a/src/Game/Goatee/Ui/Gtk/NodePropertiesPanel.hs
+++ b/src/Game/Goatee/Ui/Gtk/NodePropertiesPanel.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -26,9 +26,6 @@
   ) where
 
 import Control.Arrow ((+++))
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>), (<*), (*>))
-#endif
 import Control.Monad (forM_, unless, when)
 import qualified Data.Foldable as Foldable
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
diff --git a/src/Game/Goatee/Ui/Gtk/PlayPanel.hs b/src/Game/Goatee/Ui/Gtk/PlayPanel.hs
--- a/src/Game/Goatee/Ui/Gtk/PlayPanel.hs
+++ b/src/Game/Goatee/Ui/Gtk/PlayPanel.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -24,9 +24,6 @@
   myWidget,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad (forM, void, when)
 import Data.Foldable (forM_, mapM_)
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
diff --git a/src/Game/Goatee/Ui/Gtk/Tool.hs b/src/Game/Goatee/Ui/Gtk/Tool.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk/Tool/AssignStone.hs b/src/Game/Goatee/Ui/Gtk/Tool/AssignStone.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool/AssignStone.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool/AssignStone.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -19,9 +19,6 @@
 
 module Game.Goatee.Ui.Gtk.Tool.AssignStone (AssignStoneTool, create) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad (forM_, when)
 import Game.Goatee.Lib.Board
 import qualified Game.Goatee.Lib.Monad as Monad
diff --git a/src/Game/Goatee/Ui/Gtk/Tool/Line.hs b/src/Game/Goatee/Ui/Gtk/Tool/Line.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool/Line.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool/Line.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk/Tool/Mark.hs b/src/Game/Goatee/Ui/Gtk/Tool/Mark.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool/Mark.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool/Mark.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk/Tool/Null.hs b/src/Game/Goatee/Ui/Gtk/Tool/Null.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool/Null.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool/Null.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/src/Game/Goatee/Ui/Gtk/Tool/Play.hs b/src/Game/Goatee/Ui/Gtk/Tool/Play.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool/Play.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool/Play.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -19,9 +19,6 @@
 
 module Game.Goatee.Ui.Gtk.Tool.Play (PlayTool, create) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad (when)
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
 import Data.Maybe (fromJust, isJust)
diff --git a/src/Game/Goatee/Ui/Gtk/Tool/Visibility.hs b/src/Game/Goatee/Ui/Gtk/Tool/Visibility.hs
--- a/src/Game/Goatee/Ui/Gtk/Tool/Visibility.hs
+++ b/src/Game/Goatee/Ui/Gtk/Tool/Visibility.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -19,12 +19,7 @@
 
 module Game.Goatee.Ui.Gtk.Tool.Visibility (VisibilityTool, create) where
 
-import Control.Applicative (
-#if !MIN_VERSION_base(4,8,0)
-  (<$>),
-#endif
-  (<|>),
-  )
+import Control.Applicative ((<|>))
 import Control.Monad (void, when)
 import Data.Foldable (forM_)
 import Data.List (intercalate)
diff --git a/src/Game/Goatee/Ui/Gtk/Utils.hs b/src/Game/Goatee/Ui/Gtk/Utils.hs
--- a/src/Game/Goatee/Ui/Gtk/Utils.hs
+++ b/src/Game/Goatee/Ui/Gtk/Utils.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -24,9 +24,6 @@
   textViewConfigure
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 import Control.Monad (void, when)
 import qualified Game.Goatee.Common.Bigfloat as BF
 import Game.Goatee.Ui.Gtk.Latch
diff --git a/src/Game/Goatee/Ui/Gtk/Widget.hs b/src/Game/Goatee/Ui/Gtk/Widget.hs
--- a/src/Game/Goatee/Ui/Gtk/Widget.hs
+++ b/src/Game/Goatee/Ui/Gtk/Widget.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
@@ -28,9 +28,6 @@
   goateeSpinButtonSetValue, goateeSpinButtonOnSpinned,
   ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>), (<*>))
-#endif
 import Control.Monad (void)
 import qualified Game.Goatee.Common.Bigfloat as BF
 import Game.Goatee.Ui.Gtk.Latch
diff --git a/tests/Game/Goatee/Ui/Gtk/CommonTest.hs b/tests/Game/Goatee/Ui/Gtk/CommonTest.hs
--- a/tests/Game/Goatee/Ui/Gtk/CommonTest.hs
+++ b/tests/Game/Goatee/Ui/Gtk/CommonTest.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/tests/Game/Goatee/Ui/Gtk/LatchTest.hs b/tests/Game/Goatee/Ui/Gtk/LatchTest.hs
--- a/tests/Game/Goatee/Ui/Gtk/LatchTest.hs
+++ b/tests/Game/Goatee/Ui/Gtk/LatchTest.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
diff --git a/tests/Test.hs b/tests/Test.hs
--- a/tests/Test.hs
+++ b/tests/Test.hs
@@ -1,6 +1,6 @@
 -- This file is part of Goatee.
 --
--- Copyright 2014-2018 Bryan Gardiner
+-- Copyright 2014-2021 Bryan Gardiner
 --
 -- Goatee is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU Affero General Public License as published by
