diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # CHANGELOG
 
+## Version 0.2.0
+
+- Removed dependency on `quickcheck-instances`.
+- It now compiles under GHC 7.10.3!
+
 ## Version 0.1.0
 
 This is the first release of `language-ninja`!
diff --git a/language-ninja.cabal b/language-ninja.cabal
--- a/language-ninja.cabal
+++ b/language-ninja.cabal
@@ -1,7 +1,7 @@
 --------------------------------------------------------------------------------
 
 name:                     language-ninja
-version:                  0.1.0
+version:                  0.2.0
 stability:                Experimental
 build-type:               Custom
 cabal-version:            >= 1.10
@@ -21,7 +21,8 @@
                           the "Language.Ninja" module.
 extra-source-files:       README.md
                         , CHANGELOG.md
-tested-with:              GHC == 8.0.1
+tested-with:              GHC == 7.10.3
+                        , GHC == 8.0.2
                           
 --------------------------------------------------------------------------------
 
@@ -32,7 +33,7 @@
 
 source-repository this
     type:                 git
-    tag:                  release-0.1.0
+    tag:                  release-0.2.0
     location:             https://github.com/awakesecurity/language-ninja.git
 
 --------------------------------------------------------------------------------
@@ -58,11 +59,11 @@
                         , mtl                         >= 2.2   && < 2.3
                         , lens                        >= 4.15  && < 4.16
                         , QuickCheck                  >= 2.9   && < 2.10
-                        , quickcheck-instances        >= 0.3   && < 0.4
+                        , semigroups                  >= 0.18  && < 0.19
                         , smallcheck                  >= 1.1   && < 1.2
                         , system-filepath             >= 0.4   && < 0.5
                         , text                        >= 1.2   && < 1.3
-                        , transformers                >= 0.5   && < 0.6
+                        , transformers                >= 0.4   && < 0.6
                         , unordered-containers        >= 0.2   && < 0.3
                         , versions                    >= 3.1.1 && < 3.2
     exposed-modules:      Language.Ninja
@@ -99,7 +100,8 @@
                         , Language.Ninja.Misc.Path
                         , Language.Ninja.Misc.Positive
     default-language:     Haskell2010
-    other-extensions:     ConstraintKinds
+    other-extensions:     CPP
+                        , ConstraintKinds
                         , DeriveDataTypeable
                         , DeriveFoldable
                         , DeriveFunctor
@@ -118,7 +120,8 @@
                         , RecordWildCards
                         , ScopedTypeVariables
                         , UndecidableInstances
-    ghc-options:          -Wcompat -Weverything
+    if impl(ghc >= 8.0)
+       ghc-options:       -Wcompat -Weverything
                           -fno-warn-unsafe
                           -fno-warn-safe
                           -fno-warn-implicit-prelude
@@ -126,6 +129,8 @@
                           -fno-warn-missed-specialisations
                           -fno-warn-all-missed-specialisations
                           -g
+    else
+       ghc-options:       -Wall -g
 
 --------------------------------------------------------------------------------
 
@@ -144,15 +149,13 @@
                         , bytestring                  >= 0.10  && < 0.11
                         , containers                  >= 0.5   && < 0.6
                         , flow                        >= 1.0   && < 1.1
-                        , ghc                         >= 7.4   && < 8.4
-                        , haddock-api                 >= 2.17  && < 2.18
-                        , haddock-library             >= 1.4   && < 1.5
                         , hashable                    >= 1.2   && < 1.3
                         , lens                        >= 4.15  && < 4.16
                         , monad-mock                  >= 0.1   && < 0.2
                         , mtl                         >= 2.2   && < 2.3
                         , QuickCheck                  >= 2.9   && < 2.10
                         , quickcheck-instances        >= 0.3   && < 0.4
+                        , semigroups                  >= 0.18  && < 0.19
                         , smallcheck                  >= 1.1   && < 1.2
                         , system-filepath             >= 0.4   && < 0.5
                         , tasty                       >= 0.11  && < 0.12
@@ -162,12 +165,17 @@
                         , tasty-quickcheck            >= 0.8   && < 0.9
                         , tasty-smallcheck            >= 0.8   && < 0.9
                         , text                        >= 1.2   && < 1.3
-                        , transformers                >= 0.5   && < 0.6
+                        , transformers                >= 0.4   && < 0.6
                         , turtle                      >= 1.3   && < 1.4
                         , unordered-containers        >= 0.2   && < 0.3
                         , versions                    >= 3.1.1 && < 3.2
+    if impl(ghc >= 8.0)
+       build-depends:     ghc                         >= 7.4   && < 8.4
+                        , haddock-api                 >= 2.17  && < 2.18
+                        , haddock-library             >= 1.4   && < 1.5
     default-language:     Haskell2010
-    other-extensions:     FlexibleContexts
+    other-extensions:     CPP
+                        , FlexibleContexts
                         , FlexibleInstances
                         , GADTs
                         , LambdaCase
@@ -178,11 +186,11 @@
                         , RecordWildCards
                         , ScopedTypeVariables
                         , StandaloneDeriving
-                        , TypeApplications
                         , TypeFamilies
                         , UndecidableInstances
                         , ViewPatterns
-    ghc-options:          -Wcompat -Weverything
+    if impl(ghc >= 8.0)
+       ghc-options:       -Wcompat -Weverything
                           -fno-warn-unsafe
                           -fno-warn-safe
                           -fno-warn-implicit-prelude
@@ -190,17 +198,22 @@
                           -fno-warn-missed-specialisations
                           -fno-warn-all-missed-specialisations
                           -g -threaded
+    else
+       ghc-options:       -Wall
+                          -g -threaded
 
 --------------------------------------------------------------------------------
 
 test-suite doctests
+    if impl(ghc < 8.0)
+       buildable:         False
     type:                 exitcode-stdio-1.0
     hs-source-dirs:       tests
     main-is:              DocTests.hs
     build-depends:        base                        >= 4.8   && < 5.0
                         , doctest                     >= 0.11  && < 0.12
                         , QuickCheck                  >= 2.9   && < 2.10
-                        , template-haskell            >= 2.11  && < 2.12
+                        , template-haskell            >= 2.10  && < 2.12
                         -- TODO: this shouldn't need to be here
                         -- remove this once https://git.io/vQp2m is merged
                         , cabal-doctest               >= 1.0.2 && < 1.1
@@ -223,7 +236,7 @@
                         -- , prettyprinter               >= 1.1   && < 1.2
                         -- , prettyprinter-ansi-terminal >= 1.1   && < 1.2
                         , text                        >= 1.2   && < 1.3
-                        , transformers                >= 0.5   && < 0.6
+                        , transformers                >= 0.4   && < 0.6
     default-language:     Haskell2010
     other-extensions:     DataKinds
                         , DeriveGeneric
@@ -233,7 +246,8 @@
                         , OverloadedStrings
                         , StandaloneDeriving
                         , TypeOperators
-    ghc-options:          -Wcompat -Weverything
+    if impl(ghc >= 8.0)
+       ghc-options:       -Wcompat -Weverything
                           -fno-warn-unsafe
                           -fno-warn-safe
                           -fno-warn-implicit-prelude
@@ -241,6 +255,9 @@
                           -fno-warn-missed-specialisations
                           -fno-warn-all-missed-specialisations
                           -g -threaded
+    else
+       ghc-options:       -Wall
+                          -g -threaded
 
 --------------------------------------------------------------------------------
 
@@ -258,7 +275,7 @@
                         -- , prettyprinter               >= 1.1   && < 1.2
                         -- , prettyprinter-ansi-terminal >= 1.1   && < 1.2
                         , text                        >= 1.2   && < 1.3
-                        , transformers                >= 0.5   && < 0.6
+                        , transformers                >= 0.4   && < 0.6
     default-language:     Haskell2010
     other-extensions:     DataKinds
                         , DeriveGeneric
@@ -268,7 +285,8 @@
                         , OverloadedStrings
                         , StandaloneDeriving
                         , TypeOperators
-    ghc-options:          -Wcompat -Weverything
+    if impl(ghc >= 8.0)
+       ghc-options:       -Wcompat -Weverything
                           -fno-warn-unsafe
                           -fno-warn-safe
                           -fno-warn-implicit-prelude
@@ -276,6 +294,9 @@
                           -fno-warn-missed-specialisations
                           -fno-warn-all-missed-specialisations
                           -g -threaded
+    else
+       ghc-options:       -Wall
+                          -g -threaded
 
 --------------------------------------------------------------------------------
 
@@ -293,7 +314,7 @@
                         -- , prettyprinter               >= 1.1   && < 1.2
                         -- , prettyprinter-ansi-terminal >= 1.1   && < 1.2
                         , text                        >= 1.2   && < 1.3
-                        , transformers                >= 0.5   && < 0.6
+                        , transformers                >= 0.4   && < 0.6
     default-language:     Haskell2010
     other-extensions:     DataKinds
                         , DeriveGeneric
@@ -303,13 +324,17 @@
                         , OverloadedStrings
                         , StandaloneDeriving
                         , TypeOperators
-    ghc-options:          -Wcompat -Weverything
+    if impl(ghc >= 8.0)
+       ghc-options:       -Wcompat -Weverything
                           -fno-warn-unsafe
                           -fno-warn-safe
                           -fno-warn-implicit-prelude
                           -fno-warn-unused-do-bind
                           -fno-warn-missed-specialisations
                           -fno-warn-all-missed-specialisations
+                          -g -threaded
+    else
+       ghc-options:       -Wall
                           -g -threaded
 
 --------------------------------------------------------------------------------
diff --git a/library/Language/Ninja/AST/Build.hs b/library/Language/Ninja/AST/Build.hs
--- a/library/Language/Ninja/AST/Build.hs
+++ b/library/Language/Ninja/AST/Build.hs
@@ -48,30 +48,29 @@
   , BuildConstraint
   ) where
 
-import qualified Control.Lens              as Lens
+import qualified Control.Lens            as Lens
 
-import           Flow                      ((.>), (|>))
+import           Flow                    ((.>), (|>))
 
-import           Data.HashMap.Strict       (HashMap)
-import           Data.Text                 (Text)
+import           Data.HashMap.Strict     (HashMap)
+import           Data.Text               (Text)
 
-import           Control.DeepSeq           (NFData)
-import           Data.Hashable             (Hashable)
-import           GHC.Generics              (Generic)
+import           Control.DeepSeq         (NFData)
+import           Data.Hashable           (Hashable)
+import           GHC.Generics            (Generic)
 
-import qualified Test.QuickCheck           as QC
-import           Test.QuickCheck.Instances ()
+import qualified Test.QuickCheck         as QC
 
-import qualified Test.SmallCheck.Series    as SC
+import qualified Test.SmallCheck.Series  as SC
 
-import           GHC.Exts                  (Constraint)
+import           GHC.Exts                (Constraint)
 
-import           Data.Aeson                ((.:), (.=))
-import qualified Data.Aeson                as Aeson
+import           Data.Aeson              ((.:), (.=))
+import qualified Data.Aeson              as Aeson
 
-import qualified Language.Ninja.AST.Deps   as AST
-import qualified Language.Ninja.AST.Env    as AST
-import qualified Language.Ninja.Misc       as Misc
+import qualified Language.Ninja.AST.Deps as AST
+import qualified Language.Ninja.AST.Env  as AST
+import qualified Language.Ninja.Misc     as Misc
 
 --------------------------------------------------------------------------------
 
@@ -174,8 +173,9 @@
 
 -- | Reasonable 'QC.Arbitrary' instance for 'Build'.
 --
---   @since 0.1.0
-instance (QC.Arbitrary ann) => QC.Arbitrary (Build ann) where
+--   @since 0.2.0
+instance ( QC.Arbitrary ann, BuildConstraint QC.Arbitrary ann
+         ) => QC.Arbitrary (Build ann) where
   arbitrary = MkBuild
               <$> QC.arbitrary
               <*> QC.arbitrary
diff --git a/library/Language/Ninja/AST/Deps.hs b/library/Language/Ninja/AST/Deps.hs
--- a/library/Language/Ninja/AST/Deps.hs
+++ b/library/Language/Ninja/AST/Deps.hs
@@ -49,28 +49,27 @@
   , DepsConstraint
   ) where
 
-import qualified Control.Lens              as Lens
+import qualified Control.Lens           as Lens
 
-import           Flow                      ((|>))
+import           Flow                   ((|>))
 
-import           Data.HashSet              (HashSet)
-import           Data.Text                 (Text)
+import           Data.HashSet           (HashSet)
+import           Data.Text              (Text)
 
-import           Control.DeepSeq           (NFData)
-import           Data.Hashable             (Hashable)
-import           GHC.Generics              (Generic)
+import           Control.DeepSeq        (NFData)
+import           Data.Hashable          (Hashable)
+import           GHC.Generics           (Generic)
 
-import qualified Test.QuickCheck           as QC
-import           Test.QuickCheck.Instances ()
+import qualified Test.QuickCheck        as QC
 
-import qualified Test.SmallCheck.Series    as SC
+import qualified Test.SmallCheck.Series as SC
 
-import           GHC.Exts                  (Constraint)
+import           GHC.Exts               (Constraint)
 
-import           Data.Aeson                ((.:), (.=))
-import qualified Data.Aeson                as Aeson
+import           Data.Aeson             ((.:), (.=))
+import qualified Data.Aeson             as Aeson
 
-import qualified Language.Ninja.Misc       as Misc
+import qualified Language.Ninja.Misc    as Misc
 
 --------------------------------------------------------------------------------
 
@@ -153,8 +152,9 @@
 
 -- | Reasonable 'QC.Arbitrary' instance for 'Deps'.
 --
---   @since 0.1.0
-instance (QC.Arbitrary ann) => QC.Arbitrary (Deps ann) where
+--   @since 0.2.0
+instance ( QC.Arbitrary ann, DepsConstraint QC.Arbitrary ann
+         ) => QC.Arbitrary (Deps ann) where
   arbitrary = MkDeps
               <$> QC.arbitrary
               <*> QC.arbitrary
diff --git a/library/Language/Ninja/AST/Env.hs b/library/Language/Ninja/AST/Env.hs
--- a/library/Language/Ninja/AST/Env.hs
+++ b/library/Language/Ninja/AST/Env.hs
@@ -62,33 +62,32 @@
   , Key, Maps
   ) where
 
-import           Control.Applicative       ((<|>))
-import           Control.Monad             ((>=>))
+import           Control.Applicative    ((<|>))
+import           Control.Monad          ((>=>))
 
-import qualified Control.Lens              as Lens
+import qualified Control.Lens           as Lens
 
-import           Data.Monoid               (Endo (Endo, appEndo))
+import           Data.Monoid            (Endo (Endo, appEndo))
 
-import           Data.List.NonEmpty        (NonEmpty ((:|)))
-import qualified Data.List.NonEmpty        as NE
+import           Data.List.NonEmpty     (NonEmpty ((:|)))
+import qualified Data.List.NonEmpty     as NE
 
-import           Data.HashMap.Strict       (HashMap)
-import qualified Data.HashMap.Strict       as HM
+import           Data.HashMap.Strict    (HashMap)
+import qualified Data.HashMap.Strict    as HM
 
-import           Control.DeepSeq           (NFData)
-import           Data.Hashable             (Hashable)
-import           GHC.Generics              (Generic)
+import           Control.DeepSeq        (NFData)
+import           Data.Hashable          (Hashable)
+import           GHC.Generics           (Generic)
 
-import qualified Test.QuickCheck           as QC
-import           Test.QuickCheck.Instances ()
+import qualified Test.QuickCheck        as QC
 
-import qualified Test.SmallCheck.Series    as SC
+import qualified Test.SmallCheck.Series as SC
 
-import           GHC.Exts                  (Constraint)
+import           GHC.Exts               (Constraint)
 
-import qualified Data.Aeson                as Aeson
+import qualified Data.Aeson             as Aeson
 
-import           Flow                      ((.>), (|>))
+import           Flow                   ((.>), (|>))
 
 --------------------------------------------------------------------------------
 
diff --git a/library/Language/Ninja/AST/Expr.hs b/library/Language/Ninja/AST/Expr.hs
--- a/library/Language/Ninja/AST/Expr.hs
+++ b/library/Language/Ninja/AST/Expr.hs
@@ -53,36 +53,35 @@
   , ExprConstraint
   ) where
 
-import           Control.Arrow             (second)
+import           Control.Arrow          (second)
 
-import qualified Control.Lens              as Lens
+import qualified Control.Lens           as Lens
 
-import           Data.Foldable             (asum)
-import           Data.Maybe                (fromMaybe)
-import           Data.Monoid               (Endo (Endo, appEndo), (<>))
+import           Data.Foldable          (asum)
+import           Data.Maybe             (fromMaybe)
+import           Data.Monoid            (Endo (Endo, appEndo), (<>))
 
-import           Flow                      ((.>), (|>))
+import           Flow                   ((.>), (|>))
 
-import           Data.Text                 (Text)
-import qualified Data.Text                 as Text
+import           Data.Text              (Text)
+import qualified Data.Text              as Text
 
-import           Control.DeepSeq           (NFData)
-import           Data.Data                 (Data)
-import           Data.Hashable             (Hashable)
-import           GHC.Generics              (Generic)
+import           Control.DeepSeq        (NFData)
+import           Data.Data              (Data)
+import           Data.Hashable          (Hashable)
+import           GHC.Generics           (Generic)
 
-import qualified Test.QuickCheck           as QC
-import           Test.QuickCheck.Instances ()
+import qualified Test.QuickCheck        as QC
 
-import qualified Test.SmallCheck.Series    as SC
+import qualified Test.SmallCheck.Series as SC
 
-import           GHC.Exts                  (Constraint)
+import           GHC.Exts               (Constraint)
 
-import           Data.Aeson                ((.:), (.=))
-import qualified Data.Aeson                as Aeson
+import           Data.Aeson             ((.:), (.=))
+import qualified Data.Aeson             as Aeson
 
-import qualified Language.Ninja.AST.Env    as AST
-import qualified Language.Ninja.Misc       as Misc
+import qualified Language.Ninja.AST.Env as AST
+import qualified Language.Ninja.Misc    as Misc
 
 --------------------------------------------------------------------------------
 
@@ -242,8 +241,10 @@
 
 -- | Reasonable 'QC.Arbitrary' instance for 'Expr'.
 --
---   @since 0.1.0
-instance forall ann. (QC.Arbitrary ann) => QC.Arbitrary (Expr ann) where
+--   @since 0.2.0
+instance forall ann.
+         ( QC.Arbitrary ann, ExprConstraint QC.Arbitrary ann
+         ) => QC.Arbitrary (Expr ann) where
   arbitrary = QC.sized go
     where
       go :: Int -> QC.Gen (Expr ann)
diff --git a/library/Language/Ninja/AST/Ninja.hs b/library/Language/Ninja/AST/Ninja.hs
--- a/library/Language/Ninja/AST/Ninja.hs
+++ b/library/Language/Ninja/AST/Ninja.hs
@@ -55,37 +55,36 @@
   , Outputs, Output
   ) where
 
-import           Control.Monad             ((>=>))
+import           Control.Monad            ((>=>))
 
-import qualified Control.Lens              as Lens
+import qualified Control.Lens             as Lens
 
-import           Flow                      ((.>), (|>))
+import           Flow                     ((.>), (|>))
 
-import           Data.HashMap.Strict       (HashMap)
-import qualified Data.HashMap.Strict       as HM
+import           Data.HashMap.Strict      (HashMap)
+import qualified Data.HashMap.Strict      as HM
 
-import           Data.HashSet              (HashSet)
+import           Data.HashSet             (HashSet)
 
-import           Data.Text                 (Text)
+import           Data.Text                (Text)
 
-import           Control.DeepSeq           (NFData)
-import           Data.Hashable             (Hashable)
-import           GHC.Generics              (Generic)
+import           Control.DeepSeq          (NFData)
+import           Data.Hashable            (Hashable)
+import           GHC.Generics             (Generic)
 
-import qualified Test.QuickCheck           as QC
-import           Test.QuickCheck.Instances ()
+import qualified Test.QuickCheck          as QC
 
-import qualified Test.SmallCheck.Series    as SC
+import qualified Test.SmallCheck.Series   as SC
 
-import           GHC.Exts                  (Constraint)
+import           GHC.Exts                 (Constraint)
 
-import           Data.Aeson                ((.:), (.=))
-import qualified Data.Aeson                as Aeson
-import qualified Data.Aeson.Types          as Aeson
+import           Data.Aeson               ((.:), (.=))
+import qualified Data.Aeson               as Aeson
+import qualified Data.Aeson.Types         as Aeson
 
-import qualified Language.Ninja.AST.Build  as AST
-import qualified Language.Ninja.AST.Rule   as AST
-import qualified Language.Ninja.Misc       as Misc
+import qualified Language.Ninja.AST.Build as AST
+import qualified Language.Ninja.AST.Rule  as AST
+import qualified Language.Ninja.Misc      as Misc
 
 --------------------------------------------------------------------------------
 
@@ -247,8 +246,9 @@
 
 -- | Reasonable 'QC.Arbitrary' instance for 'Ninja'.
 --
---   @since 0.1.0
-instance (QC.Arbitrary ann) => QC.Arbitrary (Ninja ann) where
+--   @since 0.2.0
+instance ( QC.Arbitrary ann, NinjaConstraint QC.Arbitrary ann
+         ) => QC.Arbitrary (Ninja ann) where
   arbitrary = MkNinja
               <$> QC.arbitrary
               <*> QC.arbitrary
diff --git a/library/Language/Ninja/AST/Rule.hs b/library/Language/Ninja/AST/Rule.hs
--- a/library/Language/Ninja/AST/Rule.hs
+++ b/library/Language/Ninja/AST/Rule.hs
@@ -47,31 +47,30 @@
   , RuleConstraint
   ) where
 
-import qualified Control.Lens              as Lens
+import qualified Control.Lens            as Lens
 
-import           Flow                      ((|>))
+import           Flow                    ((|>))
 
-import           Data.HashMap.Strict       (HashMap)
-import qualified Data.HashMap.Strict       as HM
+import           Data.HashMap.Strict     (HashMap)
+import qualified Data.HashMap.Strict     as HM
 
-import           Data.Text                 (Text)
+import           Data.Text               (Text)
 
-import           Control.DeepSeq           (NFData)
-import           Data.Hashable             (Hashable)
-import           GHC.Generics              (Generic)
+import           Control.DeepSeq         (NFData)
+import           Data.Hashable           (Hashable)
+import           GHC.Generics            (Generic)
 
-import qualified Test.QuickCheck           as QC
-import           Test.QuickCheck.Instances ()
+import qualified Test.QuickCheck         as QC
 
-import qualified Test.SmallCheck.Series    as SC
+import qualified Test.SmallCheck.Series  as SC
 
-import           GHC.Exts                  (Constraint)
+import           GHC.Exts                (Constraint)
 
-import           Data.Aeson                ((.:), (.=))
-import qualified Data.Aeson                as Aeson
+import           Data.Aeson              ((.:), (.=))
+import qualified Data.Aeson              as Aeson
 
-import qualified Language.Ninja.AST.Expr   as AST
-import qualified Language.Ninja.Misc       as Misc
+import qualified Language.Ninja.AST.Expr as AST
+import qualified Language.Ninja.Misc     as Misc
 
 --------------------------------------------------------------------------------
 
@@ -133,8 +132,9 @@
 
 -- | Reasonable 'QC.Arbitrary' instance for 'Rule'.
 --
---   @since 0.1.0
-instance (QC.Arbitrary ann) => QC.Arbitrary (Rule ann) where
+--   @since 0.2.0
+instance ( QC.Arbitrary ann, RuleConstraint QC.Arbitrary ann
+         ) => QC.Arbitrary (Rule ann) where
   arbitrary = MkRule <$> QC.arbitrary <*> QC.arbitrary
 
 -- | Default 'Hashable' instance via 'Generic'.
diff --git a/library/Language/Ninja/Lexer.hs b/library/Language/Ninja/Lexer.hs
--- a/library/Language/Ninja/Lexer.hs
+++ b/library/Language/Ninja/Lexer.hs
@@ -37,6 +37,7 @@
 
 {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
 
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE ConstraintKinds       #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
@@ -103,7 +104,9 @@
 
 import           Data.Char                  (isSpace)
 import           Data.Foldable              (asum)
+#if __GLASGOW_HASKELL__ >= 800
 import           Data.Functor               ((<$))
+#endif
 import           Data.Maybe                 (catMaybes, fromMaybe)
 
 import           Flow                       ((.>), (|>))
diff --git a/library/Language/Ninja/Parser.hs b/library/Language/Ninja/Parser.hs
--- a/library/Language/Ninja/Parser.hs
+++ b/library/Language/Ninja/Parser.hs
@@ -35,6 +35,7 @@
 --     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 --     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE ConstraintKinds       #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
@@ -83,7 +84,9 @@
 
 import qualified Control.Lens               as Lens
 
+#if __GLASGOW_HASKELL__ >= 800
 import           Data.Maybe                 (Maybe (Just, Nothing))
+#endif
 import           Data.Monoid                (Endo (Endo, appEndo), (<>))
 
 import qualified Data.ByteString.Char8      as BSC8
diff --git a/library/Language/Ninja/Tutorial.hs b/library/Language/Ninja/Tutorial.hs
--- a/library/Language/Ninja/Tutorial.hs
+++ b/library/Language/Ninja/Tutorial.hs
@@ -17,7 +17,7 @@
 --     See the License for the specific language governing permissions and
 --     limitations under the License.
 
-{-# OPTIONS_GHC -Wno-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
 -- |
 --   Module      : Language.Ninja.Tutorial
@@ -369,7 +369,7 @@
 -- The command-line interface for @ninja-lex@ looks like this:
 --
 -- > $ ninja-lex --help
--- > ninja-lex version 0.1.0
+-- > ninja-lex version 0.2.0
 -- >
 -- > Usage: ninja-lex (process | pretty)
 -- >
@@ -404,7 +404,7 @@
 -- The command-line interface for @ninja-parse@ looks like this:
 --
 -- > $ ninja-parse --help
--- > ninja-parse version 0.1.0
+-- > ninja-parse version 0.2.0
 -- >
 -- > Usage: ninja-parse (process | pretty)
 -- >
@@ -439,7 +439,7 @@
 -- The command-line interface for @ninja-compile@ looks like this:
 --
 -- > $ ninja-compile --help
--- > ninja-compile version 0.1.0
+-- > ninja-compile version 0.2.0
 -- >
 -- > Usage: ninja-compile [--input FILEPATH] [--output FILEPATH] [--machine-readable]
 -- >
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -23,7 +23,6 @@
 {-# LANGUAGE OverloadedStrings     #-}
 {-# LANGUAGE RankNTypes            #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
-{-# LANGUAGE TypeApplications      #-}
 {-# LANGUAGE TypeFamilies          #-}
 {-# LANGUAGE UndecidableInstances  #-}
 
@@ -42,6 +41,8 @@
 
 import qualified Data.Typeable              as Ty
 
+import           Data.HashMap.Strict        (HashMap)
+import           Data.HashSet               (HashSet)
 import           Data.Text                  (Text)
 
 import           Control.Exception          (displayException)
@@ -120,25 +121,28 @@
             ]
 
 aesonSC' :: (Eq x, Show x)
-         => SC.Series IO x
+         => Ty.Proxy x
+         -> SC.Series IO x
          -> (x -> Aeson.Value)
          -> (Aeson.Value -> Aeson.Parser x)
          -> TestTree
-aesonSC' s toJ fromJ
+aesonSC' _ s toJ fromJ
   = Test.SC.testProperty "parseJSON . toJSON ≡ₛ pure"
     (Test.SC.over s (\x -> Aeson.parseEither fromJ (toJ x) == Right x))
 
 aesonSC :: forall x.
            ( Eq x, Show x, SC.Serial IO x, Aeson.ToJSON x, Aeson.FromJSON x
            ) => Ty.Proxy x -> TestTree
-aesonSC _ = aesonSC' @x SC.series Aeson.toJSON Aeson.parseJSON
+aesonSC _ = aesonSC' (Ty.Proxy :: Ty.Proxy x)
+            SC.series Aeson.toJSON Aeson.parseJSON
 
 aesonQC' :: (Eq x, Show x)
-         => (QC.Gen x, x -> [x])
+         => Ty.Proxy x
+         -> (QC.Gen x, x -> [x])
          -> (x -> Aeson.Value)
          -> (Aeson.Value -> Aeson.Parser x)
          -> TestTree
-aesonQC' (gen, shrink) toJ fromJ
+aesonQC' _ (gen, shrink) toJ fromJ
   = Test.QC.testProperty "parseJSON . toJSON ≡ₐ pure"
     (Test.QC.forAllShrink gen shrink
      (\x -> Aeson.parseEither fromJ (toJ x) === Right x))
@@ -146,7 +150,8 @@
 aesonQC :: forall x.
            ( Eq x, Show x, QC.Arbitrary x, Aeson.ToJSON x, Aeson.FromJSON x
            ) => Ty.Proxy x -> TestTree
-aesonQC _ = aesonQC' @x (QC.arbitrary, QC.shrink) Aeson.toJSON Aeson.parseJSON
+aesonQC _ = aesonQC' (Ty.Proxy :: Ty.Proxy x)
+            (QC.arbitrary, QC.shrink) Aeson.toJSON Aeson.parseJSON
 
 parseTestNinja :: String -> IO (AST.Ninja ())
 parseTestNinja name = do
@@ -216,85 +221,85 @@
 aesonTests
   = Test.testGroup "aeson"
     [ testModule "Language.Ninja.Lexer"
-      [ testAesonSC 2   (Ty.Proxy @(Lexer.Lexeme Bool))
-      , testAesonSC 4   (Ty.Proxy @(Lexer.LName  Bool))
-      , testAesonSC 4   (Ty.Proxy @(Lexer.LFile  Bool))
-      , testAesonSC 4   (Ty.Proxy @(Lexer.LBind  Bool))
-      , testAesonSC 2   (Ty.Proxy @(Lexer.LBuild Bool))
+      [ testAesonSC 2   (Ty.Proxy :: Ty.Proxy (Lexer.Lexeme Bool))
+      , testAesonSC 4   (Ty.Proxy :: Ty.Proxy (Lexer.LName  Bool))
+      , testAesonSC 4   (Ty.Proxy :: Ty.Proxy (Lexer.LFile  Bool))
+      , testAesonSC 4   (Ty.Proxy :: Ty.Proxy (Lexer.LBind  Bool))
+      , testAesonSC 2   (Ty.Proxy :: Ty.Proxy (Lexer.LBuild Bool))
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.IR.Build"
-      [ testAesonSC 2   (Ty.Proxy @IR.Build)
+      [ testAesonSC 2   (Ty.Proxy :: Ty.Proxy IR.Build)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.IR.Meta"
-      [ testAesonSC def (Ty.Proxy @IR.Meta)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy IR.Meta)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.IR.Ninja"
-      [ testAesonSC 2   (Ty.Proxy @IR.Ninja)
+      [ testAesonSC 2   (Ty.Proxy :: Ty.Proxy IR.Ninja)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.IR.Pool"
-      [ testAesonSC def (Ty.Proxy @IR.Pool)
-      , testAesonSC def (Ty.Proxy @IR.PoolName)
-      , testAesonSC def (Ty.Proxy @IR.PoolDepth)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy IR.Pool)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.PoolName)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.PoolDepth)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.IR.Rule"
-      [ testAesonSC 1   (Ty.Proxy @IR.Rule)
-      , testAesonSC def (Ty.Proxy @IR.SpecialDeps)
-      , testAesonSC def (Ty.Proxy @IR.ResponseFile)
+      [ testAesonSC 1   (Ty.Proxy :: Ty.Proxy IR.Rule)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.SpecialDeps)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.ResponseFile)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.IR.Target"
-      [ testAesonSC def (Ty.Proxy @IR.Target)
-      , testAesonSC def (Ty.Proxy @IR.Output)
-      , testAesonSC def (Ty.Proxy @IR.Dependency)
-      , testAesonSC def (Ty.Proxy @IR.DependencyType)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy IR.Target)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.Output)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.Dependency)
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy IR.DependencyType)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.AST.Env"
-      [ testAesonSC def (Ty.Proxy @(AST.Env Text Text))
-      , testAesonQC     (Ty.Proxy @(AST.Env Text Text))
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy (AST.Env Text Text))
+      , testAesonQC     (Ty.Proxy :: Ty.Proxy (AST.Env Text Text))
       ]
     , testModule "Language.Ninja.AST.Expr"
-      [ testAesonSC def (Ty.Proxy @(AST.Expr Bool))
-      , testAesonQC     (Ty.Proxy @(AST.Expr Bool))
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy (AST.Expr Bool))
+      , testAesonQC     (Ty.Proxy :: Ty.Proxy (AST.Expr Bool))
       ]
     , testModule "Language.Ninja.AST.Rule"
-      [ testAesonSC def (Ty.Proxy @(AST.Rule Bool))
-      , testAesonQC     (Ty.Proxy @(AST.Rule Bool))
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy (AST.Rule Bool))
+      , testAesonQC     (Ty.Proxy :: Ty.Proxy (AST.Rule Bool))
       ]
     , testModule "Language.Ninja.AST.Ninja"
       [ -- TODO: combinatorial explosion
-        testAesonSC 0   (Ty.Proxy @(AST.Ninja Bool))
-      -- , testAesonQC     (Ty.Proxy @(AST.Ninja Bool))
+        testAesonSC 0   (Ty.Proxy :: Ty.Proxy (AST.Ninja Bool))
+      -- , testAesonQC     (Ty.Proxy :: Ty.Proxy (AST.Ninja Bool))
       ]
     , testModule "Language.Ninja.AST.Build"
       [ -- TODO: combinatorial explosion
-        testAesonSC 1   (Ty.Proxy @(AST.Build Bool))
-      -- , testAesonQC     (Ty.Proxy @(AST.Build Bool))
+        testAesonSC 1   (Ty.Proxy :: Ty.Proxy (AST.Build Bool))
+      -- , testAesonQC     (Ty.Proxy :: Ty.Proxy (AST.Build Bool))
       ]
     , testModule "Language.Ninja.AST.Deps"
-      [ testAesonSC def (Ty.Proxy @(AST.Deps Bool))
-      , testAesonQC     (Ty.Proxy @(AST.Deps Bool))
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy (AST.Deps Bool))
+      , testAesonQC     (Ty.Proxy :: Ty.Proxy (AST.Deps Bool))
       ]
     , testModule "Language.Ninja.Misc.Command"
-      [ testAesonSC def (Ty.Proxy @Misc.Command)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy Misc.Command)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.Misc.Path"
-      [ testAesonSC def (Ty.Proxy @Misc.Path)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy Misc.Path)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.Misc.Located"
-      [ testAesonSC def (Ty.Proxy @(Misc.Located Bool))
-      , testAesonSC def (Ty.Proxy @Misc.Position)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy (Misc.Located Bool))
+      , testAesonSC def (Ty.Proxy :: Ty.Proxy Misc.Position)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     , testModule "Language.Ninja.Misc.IText"
-      [ testAesonSC def (Ty.Proxy @Misc.IText)
+      [ testAesonSC def (Ty.Proxy :: Ty.Proxy Misc.IText)
       -- TODO: add Arbitrary instances so we can testAesonQC
       ]
     ]
@@ -418,39 +423,56 @@
       ]
     , testModule "Language.Ninja.AST.Expr"
       [ testType "Expr"
-        [ testPrism 4 "_Exprs" (AST._Exprs @Bool)
-        , testPrism 4 "_Lit"   (AST._Lit   @Bool)
-        , testPrism 4 "_Var"   (AST._Var   @Bool)
+        [ testPrism 4 "_Exprs"
+          (AST._Exprs :: Lens.Prism' (AST.Expr Bool) (Bool, [AST.Expr Bool]))
+        , testPrism 4 "_Lit"
+          (AST._Lit   :: Lens.Prism' (AST.Expr Bool) (Bool, Text))
+        , testPrism 4 "_Var"
+          (AST._Var   :: Lens.Prism' (AST.Expr Bool) (Bool, Text))
         ]
       ]
     , testModule "Language.Ninja.AST.Rule"
       [ testType "Rule"
-        [ testLens 4 "ruleBind" (AST.ruleBind @Bool)
+        [ testLens 4 "ruleBind"
+          (AST.ruleBind :: Lens.Lens' (AST.Rule Bool) (HashMap Text (AST.Expr Bool)))
         ]
       ]
     , testModule "Language.Ninja.AST.Ninja"
       [ testType "Ninja" [] -- TODO: combinatorial explosion
-        -- [ testLens 1 "ninjaRules"     (AST.ninjaRules     @Bool)
-        -- , testLens 1 "ninjaSingles"   (AST.ninjaSingles   @Bool)
-        -- , testLens 1 "ninjaMultiples" (AST.ninjaMultiples @Bool)
-        -- , testLens 1 "ninjaPhonys"    (AST.ninjaPhonys    @Bool)
-        -- , testLens 1 "ninjaDefaults"  (AST.ninjaDefaults  @Bool)
-        -- , testLens 1 "ninjaSpecials"  (AST.ninjaSpecials  @Bool)
+        -- [ testLens 1 "ninjaRules"
+        --   (AST.ninjaRules     :: Lens.Lens' (AST.Ninja Bool) (HashMap Text (AST.Rule Bool)))
+        -- , testLens 1 "ninjaSingles"
+        --   (AST.ninjaSingles   :: Lens.Lens' (AST.Ninja Bool) (HashMap Text (AST.Build Bool)))
+        -- , testLens 1 "ninjaMultiples"
+        --   (AST.ninjaMultiples :: Lens.Lens' (AST.Ninja Bool) (HashMap (HashSet Text) (AST.Build Bool)))
+        -- , testLens 1 "ninjaPhonys"
+        --   (AST.ninjaPhonys    :: Lens.Lens' (AST.Ninja Bool) (HashMap Text (HashSet Text)))
+        -- , testLens 1 "ninjaDefaults"
+        --   (AST.ninjaDefaults  :: Lens.Lens' (AST.Ninja Bool) (HashSet Text))
+        -- , testLens 1 "ninjaSpecials"
+        --   (AST.ninjaSpecials  :: Lens.Lens' (AST.Ninja Bool) (HashMap Text Text))
         -- ]
       ]
     , testModule "Language.Ninja.AST.Build"
       [ testType "Build" [] -- TODO: combinatorial explosion
-        -- [ testLens 1 "buildRule" (AST.buildRule @Bool)
-        -- , testLens 1 "buildEnv"  (AST.buildEnv  @Bool)
-        -- , testLens 1 "buildDeps" (AST.buildDeps @Bool)
-        -- , testLens 1 "buildBind" (AST.buildBind @Bool)
+        -- [ testLens 1 "buildRule"
+        --   (AST.buildRule :: Lens.Lens' (AST.Build Bool) Text)
+        -- , testLens 1 "buildEnv"
+        --   (AST.buildEnv  :: Lens.Lens' (AST.Build Bool) (AST.Env Text Text))
+        -- , testLens 1 "buildDeps"
+        --   (AST.buildDeps :: Lens.Lens' (AST.Build Bool) (AST.Deps Bool))
+        -- , testLens 1 "buildBind"
+        --   (AST.buildBind :: Lens.Lens' (AST.Build Bool) (HashMap Text Text))
         -- ]
       ]
     , testModule "Language.Ninja.AST.Deps"
       [ testType "Deps"
-        [ testLens def "depsNormal"    (AST.depsNormal    @Bool)
-        , testLens def "depsImplicit"  (AST.depsImplicit  @Bool)
-        , testLens def "depsOrderOnly" (AST.depsOrderOnly @Bool)
+        [ testLens def "depsNormal"
+          (AST.depsNormal    :: Lens.Lens' (AST.Deps Bool) (HashSet Text))
+        , testLens def "depsImplicit"
+          (AST.depsImplicit  :: Lens.Lens' (AST.Deps Bool) (HashSet Text))
+        , testLens def "depsOrderOnly"
+          (AST.depsOrderOnly :: Lens.Lens' (AST.Deps Bool) (HashSet Text))
         ]
       ]
     , testModule "Language.Ninja.Misc.Command"
diff --git a/tests/Tests/Lint.hs b/tests/Tests/Lint.hs
--- a/tests/Tests/Lint.hs
+++ b/tests/Tests/Lint.hs
@@ -17,6 +17,7 @@
 --     See the License for the specific language governing permissions and
 --     limitations under the License.
 
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE GADTs                 #-}
@@ -45,6 +46,7 @@
   , ComponentName, SinceException
   ) where
 
+#if __GLASGOW_HASKELL__ >= 800
 import           Control.Applicative         (empty)
 import           Control.Arrow               ((&&&))
 import           Control.Monad               (forM)
@@ -58,10 +60,6 @@
 import qualified GHC
 import qualified Outputable                  as GHC
 
-import qualified Data.Map.Lazy               as LMap
-
-import qualified Data.Text                   as Text
-
 import qualified Documentation.Haddock       as H
 import qualified Documentation.Haddock.Types as H
 
@@ -69,20 +67,30 @@
 -- import qualified Documentation.Haddock.Parser       as H.Parser
 -- import qualified Documentation.Haddock.Parser.Monad as H.Parser
 
-import qualified Test.Tasty                  as Test
+import qualified Data.Map.Lazy               as LMap
+
+import qualified Data.Text                   as Text
+
 import qualified Test.Tasty.HUnit            as Test
 
 import qualified Turtle
+#endif
 
+import qualified Test.Tasty                  as Test
+
 --------------------------------------------------------------------------------
 
 -- | Generate and lint the Haddock documentation for this project.
 lintHaddock :: LintHaddockOptions -> IO Test.TestTree
+#if __GLASGOW_HASKELL__ < 800
+lintHaddock _ = pure (Test.testGroup "Haddock linting [skipped]" [])
+#else
 lintHaddock options = do
   _ <- H.withGhc [] GHC.getSessionDynFlags
   buildHaddock
   mapM (lintInterfaceFile options) (componentNames options)
     |> fmap (Test.testGroup "Haddock linting")
+#endif
 
 --------------------------------------------------------------------------------
 
@@ -145,6 +153,8 @@
 
 --------------------------------------------------------------------------------
 
+#if __GLASGOW_HASKELL__ >= 800
+
 lintInterfaceFile :: LintHaddockOptions -> ComponentName -> IO Test.TestTree
 lintInterfaceFile options cn
   = readInterface ifaceFP
@@ -202,8 +212,12 @@
     docmap  = H.instDocMap iface
     toIdent = MkIdent (H.instMod iface)
 
+#endif
+
 --------------------------------------------------------------------------------
 
+#if __GLASGOW_HASKELL__ >= 800
+
 data Ident
   = MkIdent
     { _identModule :: !GHC.Module
@@ -226,8 +240,12 @@
 instance Show Ident where
   show = printIdent
 
+#endif
+
 --------------------------------------------------------------------------------
 
+#if __GLASGOW_HASKELL__ >= 800
+
 class HasSince t where
   hasSince :: t -> Bool
 
@@ -236,5 +254,7 @@
 
 instance HasSince (H.Documentation name) where
   hasSince = H.documentationDoc .> maybe False hasSince
+
+#endif
 
 --------------------------------------------------------------------------------
diff --git a/tests/Tests/Orphans.hs b/tests/Tests/Orphans.hs
--- a/tests/Tests/Orphans.hs
+++ b/tests/Tests/Orphans.hs
@@ -17,7 +17,7 @@
 --     See the License for the specific language governing permissions and
 --     limitations under the License.
 
-{-# OPTIONS_GHC -Wno-orphans #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
