diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,107 +1,2 @@
-module Main where
-
-import           Control.Monad
-import           Data.List
-import           Distribution.PackageDescription    (PackageDescription (..))
 import           Distribution.Simple
-import           Distribution.Simple.Install
-import           Distribution.Simple.LocalBuildInfo
-import           Distribution.Simple.Program
-import           Distribution.Simple.Setup
-import           Distribution.Simple.Utils
-import           System.FilePath
-
--- | Run cabal with custom copyHook which puts our extra executables in the
--- libexec directory.
-main :: IO ()
-main = defaultMainWithHooks $ simpleUserHooks
-    { copyHook = copyThings,
-      hookedPrograms = [simpleProgram "git"]
-    }
-
--- | Copy "extra" executables to $PREFIX/libexec/git-vogue/ instead of
--- $PREFIX/bin.
-copyThings
-    :: PackageDescription
-    -> LocalBuildInfo
-    -> UserHooks
-    -> CopyFlags
-    -> IO ()
-copyThings pkg lbi _ flags = do
-    -- First install only the "main" components with the default settings.
-    let (main_pkg, main_lbi) = tweakMainInstall pkg lbi
-    install main_pkg main_lbi flags
-
-    -- Then install the "secondary" executables and plugin scripts with the
-    -- special settings.
-    let (sub_pkg, sub_lbi) = tweakSubcommandInstall pkg lbi
-    install sub_pkg sub_lbi flags
-
-    -- Install shell scripts from plugins/.
-    --
-    -- This was stolen from "Distribution.Simple.Install" and hacked. Why is
-    -- cabal so terrible compared to make and friends?
-    let scripts = fmap stripPluginPrefix . filter isPlugin $ dataFiles pkg
-        verbosity = fromFlag (copyVerbosity flags)
-        src_data_dir = dataDir sub_pkg
-        dest_data_dir = datadir . absoluteInstallDirs sub_pkg sub_lbi $
-                        fromFlag (copyDest flags)
-    forM_ scripts $ \ file -> do
-        let dir = takeDirectory file
-        files <- matchDirFileGlob src_data_dir file
-        createDirectoryIfMissingVerbose verbosity True (dest_data_dir </> dir)
-        forM_ files $ \file' ->
-            installExecutableFile verbosity (src_data_dir </> file')
-                                            (dest_data_dir </> file')
-
--- | Directory our plugin scripts are kept in.
-pluginPrefix :: FilePath
-pluginPrefix = "plugins/"
-
--- | Strip the 'pluginPrefix' off the front of a 'FilePath'.
-stripPluginPrefix :: FilePath -> FilePath
-stripPluginPrefix = dropWhile (== '/') . dropWhile (/= '/')
-
--- | A data file is in the plugins directory.
-isPlugin :: FilePath -> Bool
-isPlugin = (pluginPrefix `isPrefixOf`)
-
--- | Tweak parameters for install of main components (i.e. library and first
--- executable) only.
-tweakMainInstall
-    :: PackageDescription
-    -> LocalBuildInfo
-    -> (PackageDescription, LocalBuildInfo)
-tweakMainInstall pkg lbi =
-    let pkg' = pkg { executables = take 1 $ executables pkg
-                   , dataFiles = filter (not . isPlugin) $ dataFiles pkg
-                   }
-    in (pkg', lbi)
-
--- | Tweak parameters for install of secondary components (i.e. executables
--- other than the first.
-tweakSubcommandInstall
-    :: PackageDescription
-    -> LocalBuildInfo
-    -> (PackageDescription, LocalBuildInfo)
-tweakSubcommandInstall pkg lbi =
-    let dest = suffixIt . libexecdir $ installDirTemplates lbi
-        pkg' = pkg { executables = tail $ executables pkg
-                   , dataFiles = []
-                   , dataDir = dataDir pkg </> pluginPrefix
-                   , library = Nothing
-                   , testSuites = []
-                   , benchmarks = []
-                   , extraSrcFiles = []
-                   , extraTmpFiles = []
-                   , extraDocFiles = []
-                   }
-        lbi' = lbi { installDirTemplates = (installDirTemplates lbi)
-                        { bindir = dest
-                        , datadir = dest
-                        , datasubdir = toPathTemplate ""
-                        }
-                   }
-    in (pkg', lbi')
-  where
-    suffixIt = toPathTemplate . (</> "git-vogue") . fromPathTemplate
+main = defaultMain
diff --git a/git-vogue.cabal b/git-vogue.cabal
--- a/git-vogue.cabal
+++ b/git-vogue.cabal
@@ -1,5 +1,5 @@
 name:                git-vogue
-version:             0.2.2.2
+version:             0.3.0.0
 synopsis:            A framework for pre-commit checks.
 description:         Make your Haskell git repositories fashionable.
 homepage:            https://github.com/christian-marie/git-vogue
@@ -9,16 +9,11 @@
 maintainer:          Christian Marie <christian@ponies.io>, Oswyn Brent <oztastic703@gmail.com>
 copyright:           (c) 2017 Christian Marie, Anchor Systems, Pty Ltd and Others
 category:            Development
-build-type:          Custom
+build-type:          Simple
 extra-source-files:  README.md, changelog.txt
-cabal-version:       >=1.23
+cabal-version:       >= 2.0
 data-files:          templates/pre-commit
 
-custom-setup
-  setup-depends: base
-               , filepath
-               , Cabal
-
 source-repository HEAD
   type: git
   location: https://github.com/christian-marie/git-vogue
@@ -36,14 +31,15 @@
                        Git.Vogue.VCS.Null
                        Git.Vogue.PluginDiscoverer.Libexec
                        Git.Vogue.PluginCommon
+  autogen-modules:     Paths_git_vogue
   other-modules:       Paths_git_vogue
   build-depends:       base >=4.8 && <5
                      , containers
                      , directory
-                     , extra >= 1.4 && < 1.6
+                     , temporary
                      , filepath
                      , formatting
-                     , optparse-applicative >= 0.11 && < 0.14
+                     , optparse-applicative >= 0.11
                      , process
                      , split
                      , text
@@ -53,6 +49,8 @@
 executable git-vogue
   default-language:    Haskell2010
   hs-source-dirs:      src
+  autogen-modules:     Paths_git_vogue
+  other-modules:       Paths_git_vogue
   main-is:             git-vogue.hs
   build-depends:       base
                      , git-vogue
@@ -61,6 +59,7 @@
 
 executable git-vogue-cabal
   default-language:    Haskell2010
+  scope:               private
   hs-source-dirs:      src
   main-is:             git-vogue-cabal.hs
   build-depends:       base
@@ -69,6 +68,7 @@
 
 executable git-vogue-hlint
   default-language:    Haskell2010
+  scope:               private
   hs-source-dirs:      src
   main-is:             git-vogue-hlint.hs
   build-depends:       base
@@ -84,6 +84,7 @@
 
 executable git-vogue-packunused
   default-language:    Haskell2010
+  scope:               private
   hs-source-dirs:      src
   main-is:             git-vogue-packunused.hs
   build-depends:       base
@@ -92,6 +93,7 @@
 
 executable git-vogue-stylish
   default-language:    Haskell2010
+  scope:               private
   hs-source-dirs:      src
   main-is:             git-vogue-stylish.hs
   build-depends:       base
@@ -100,9 +102,11 @@
                      , strict
                      , stylish-haskell >= 0.7
 
+-- ghc_mod is off by default, and only sticking around in case it starts working
+-- again one day with ghc 8.x
 Flag ghc-mod
   Description: build ghc-mod plugin
-  Default: True
+  Default: False
 
 executable git-vogue-ghc-mod
   if flag(ghc-mod)
@@ -112,6 +116,7 @@
   else
     buildable: False
   default-language:    Haskell2010
+  scope:               private
   hs-source-dirs:      src
   main-is:             git-vogue-ghc-mod.hs
 
diff --git a/lib/Git/Vogue.hs b/lib/Git/Vogue.hs
--- a/lib/Git/Vogue.hs
+++ b/lib/Git/Vogue.hs
@@ -24,7 +24,7 @@
 import           Data.Maybe
 import           Data.Text.Lazy         (Text)
 import qualified Data.Text.Lazy.IO      as T
-import           Data.Traversable       hiding (sequence)
+import           Data.Traversable
 import           Formatting
 import           Prelude                hiding (elem, maximum, notElem)
 import           System.Directory
diff --git a/lib/Git/Vogue/PluginDiscoverer/Libexec.hs b/lib/Git/Vogue/PluginDiscoverer/Libexec.hs
--- a/lib/Git/Vogue/PluginDiscoverer/Libexec.hs
+++ b/lib/Git/Vogue/PluginDiscoverer/Libexec.hs
@@ -26,11 +26,12 @@
 import           Data.Text.Lazy         (Text)
 import qualified Data.Text.Lazy         as T
 import           Data.Traversable
-import           Extra                  (withTempFile)
 import           System.Directory
 import           System.Environment
 import           System.Exit
 import           System.FilePath
+import           System.IO
+import           System.IO.Temp         (withSystemTempFile)
 import           System.Process
 
 import           Git.Vogue.Types
@@ -57,7 +58,7 @@
     => FilePath
     -> m [Plugin m]
 discover libexec_dir = do
-    let libexec_plugins = libexec_dir </> "git-vogue"
+    let libexec_plugins = libexec_dir
 
     -- Check if libexec dir does not exist, and notify user that this may be
     -- caused by cabal being dumb.
@@ -134,11 +135,13 @@
     -> [FilePath]
     -> m Result
 runPlugin plugin cmd check_fs all_fs = liftIO $ do
-    (status, out, err) <- withTempFile (\checkFileListPath ->
-        withTempFile (\allFileListPath -> do
-          writeFile checkFileListPath (show check_fs)
-          writeFile allFileListPath (show all_fs)
-          readProcessWithExitCode plugin [cmd, checkFileListPath, allFileListPath] ""
+    (status, out, err) <- withSystemTempFile "gv1" (\checkFileList checkFileListHandle ->
+        withSystemTempFile "gv2" (\allFileList allFileListHandle -> do
+          hPutStr checkFileListHandle (show check_fs)
+          hPutStr allFileListHandle (show all_fs)
+          hFlush checkFileListHandle
+          hFlush allFileListHandle
+          readProcessWithExitCode plugin [cmd, checkFileList, allFileList] ""
         )
       )
     let glommed = fromString $ out <> err
diff --git a/src/git-vogue-cabal.hs b/src/git-vogue-cabal.hs
--- a/src/git-vogue-cabal.hs
+++ b/src/git-vogue-cabal.hs
@@ -16,7 +16,7 @@
 import           Data.Monoid
 import           Distribution.PackageDescription.Check
 import           Distribution.PackageDescription.Configuration (flattenPackageDescription)
-import           Distribution.PackageDescription.Parse         (readPackageDescription)
+import           Distribution.PackageDescription.Parse         (readGenericPackageDescription)
 import           Distribution.Simple.Utils                     (defaultPackageDesc,
                                                                 toUTF8,
                                                                 wrapText)
@@ -50,7 +50,7 @@
 check :: IO Bool
 check = do
     pdfile <- defaultPackageDesc silent
-    ppd <- readPackageDescription silent pdfile
+    ppd <- readGenericPackageDescription silent pdfile
     let pkg_desc = flattenPackageDescription ppd
     ioChecks <- checkPackageFiles pkg_desc "."
     let packageChecks = filter goodCheck $ ioChecks <> checkPackage ppd (Just pkg_desc)
@@ -81,9 +81,7 @@
     return (null packageChecks)
   where
     goodCheck (PackageDistSuspicious msg) =
-        not (or [ "ghc-options: -O2" `isInfixOf` msg
-                , "'license' is AllRightsReserved" `isInfixOf` msg
-                ])
+        not ("ghc-options: -O2" `isInfixOf` msg || "'license' is AllRightsReserved" `isInfixOf` msg)
     goodCheck _ = True
 
     printCheckMessages = mapM_ (outputBad . format . explanation)
diff --git a/src/git-vogue-ghc-mod.hs b/src/git-vogue-ghc-mod.hs
--- a/src/git-vogue-ghc-mod.hs
+++ b/src/git-vogue-ghc-mod.hs
@@ -7,6 +7,8 @@
 -- the 3-clause BSD licence.
 --
 
+{-# LANGUAGE LambdaCase #-}
+
 -- | Description: Check with "cabal check".
 module Main where
 
@@ -14,14 +16,14 @@
 import           Control.Monad
 import           Data.Char
 import           Data.Foldable
-import           Data.List              hiding (and, notElem)
+import           Data.List              hiding (and)
 import           Data.Maybe
 import           Data.Monoid
 import           Data.Traversable
 import           GhcMod
 import           GhcMod.Monad
 import           Git.Vogue.PluginCommon
-import           Prelude                hiding (and, notElem)
+import           Prelude                hiding (and)
 import           System.Exit
 
 main :: IO ()
@@ -87,8 +89,8 @@
                 return rs
 
     -- Traverse the errors, picking errors and warnings out
-    maybe_ws <- for warn_errs $ \warn_err ->
-        case warn_err of
+    maybe_ws <- for warn_errs $
+        \case
             -- Errors in files
             Left e ->
                 return . Just $ explain e
diff --git a/src/git-vogue-hlint.hs b/src/git-vogue-hlint.hs
--- a/src/git-vogue-hlint.hs
+++ b/src/git-vogue-hlint.hs
@@ -17,14 +17,14 @@
 import           Control.Monad
 import           Data.Bifunctor
 import           Data.Foldable
-import           Data.List                           hiding (and, concat)
+import           Data.List                           hiding (concat)
 import           Data.Monoid
 import           Data.Traversable
 import           Git.Vogue.PluginCommon
 import           Language.Haskell.Exts.SrcLoc
 import           Language.Haskell.HLint3
 import           Language.Preprocessor.Cpphs
-import           Prelude                             hiding (and, concat)
+import           Prelude                             hiding (concat)
 import           System.Directory
 import           System.Exit
 
diff --git a/src/git-vogue-packunused.hs b/src/git-vogue-packunused.hs
--- a/src/git-vogue-packunused.hs
+++ b/src/git-vogue-packunused.hs
@@ -17,7 +17,7 @@
 import           Data.Foldable
 import           Data.Monoid
 import           Git.Vogue.PluginCommon
-import           Prelude                hiding (and, mapM_)
+import           Prelude                hiding (and)
 import           System.Exit
 import           System.IO.Error
 import           System.Process
diff --git a/src/git-vogue-stylish.hs b/src/git-vogue-stylish.hs
--- a/src/git-vogue-stylish.hs
+++ b/src/git-vogue-stylish.hs
@@ -66,7 +66,7 @@
     let v = makeVerbose False
     in do
        config <- configFilePath v Nothing
-       loadConfig v (Just config)
+       loadConfig v config
 
 -- | Checks whether running Stylish over a given file produces any differences.
 -- Returns TRUE if there's nothing left to change.
