diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 # Revision history for input-parsers
 
+## 0.3 -- 2022-10-02
+
+* Dropped support for GHC < 8.4
+* Incremented the upper bound of the `monoid-subclasses` dependency.
+* Added `-Wall` and fixed all warnings.
+
+## 0.2.3.2 -- 2022-03-25
+
+* Incremented the upper bound of the `text` dependency.
+
 ## 0.2.3.1 -- 2021-11-25
 
 * Incremented the upper bound of the optional `attoparsec` dependency.
diff --git a/input-parsers.cabal b/input-parsers.cabal
--- a/input-parsers.cabal
+++ b/input-parsers.cabal
@@ -1,6 +1,6 @@
 cabal-version:       >=1.10
 name:                input-parsers
-version:             0.2.3.2
+version:             0.3
 synopsis:            Extension of the parsers library with more capability and efficiency
 description:
                      Extended version of the parsers library, with the additional classes providing more
@@ -38,7 +38,7 @@
                        Text.Parser.Wrapper
   other-modules:       Text.Parser.Internal
   build-depends:       base >=4.9 && <5, bytestring >=0.10 && <0.12, text >=1.2 && <2.1,
-                       monoid-subclasses >= 1.0 && < 1.2, parsers >= 0.12 && < 0.13,
+                       monoid-subclasses >= 1.0 && < 1.3, parsers >= 0.12 && < 0.13,
                        transformers >=0.2 && <0.6
   if flag(binary)
     build-depends: binary     >= 0.7.2    && < 1
@@ -48,3 +48,4 @@
     build-depends: attoparsec >= 0.12.1.4 && < 0.15, bytestring >= 0.9 && < 0.12, text >= 0.1 && < 2.1
   hs-source-dirs:      src
   default-language:    Haskell2010
+  GHC-options:         -Wall
diff --git a/src/Text/Parser/Deterministic.hs b/src/Text/Parser/Deterministic.hs
--- a/src/Text/Parser/Deterministic.hs
+++ b/src/Text/Parser/Deterministic.hs
@@ -6,8 +6,7 @@
 
 module Text.Parser.Deterministic where
 
-import Control.Applicative (Applicative ((<*>), pure), Alternative ((<|>), many, some), liftA2, optional)
-import Control.Arrow (first)
+import Control.Applicative (Alternative ((<|>), many, some), liftA2, optional)
 import Control.Monad (MonadPlus, void)
 import Control.Monad.Trans.Identity (IdentityT(..))
 import Control.Monad.Trans.Reader (ReaderT(..), mapReaderT)
@@ -17,17 +16,10 @@
 import qualified Control.Monad.Trans.State.Strict as Strict (StateT(StateT))
 import qualified Control.Monad.Trans.RWS.Lazy as Lazy (RWST(RWST))
 import qualified Control.Monad.Trans.RWS.Strict as Strict (RWST(RWST))
-import Data.Functor ((<$>))
-import qualified Data.List as List
-import Data.Monoid (Monoid, mappend, mempty)
-import Data.String (IsString (fromString))
 import Text.ParserCombinators.ReadP (ReadP)
 import qualified Text.ParserCombinators.ReadP as ReadP
 
-import Text.Parser.Char (CharParsing)
-import Text.Parser.Combinators (Parsing, count, eof, notFollowedBy, try, unexpected)
-import Text.Parser.LookAhead (LookAheadParsing, lookAhead)
-import qualified Text.Parser.Char as Char
+import Text.Parser.Combinators (Parsing, notFollowedBy, try)
 
 import Text.Parser.Internal (mapLazyWriterT, mapStrictWriterT,
                              mapLazyStateT, mapStrictStateT,
@@ -35,22 +27,11 @@
 import Text.Parser.Wrapper (Lazy(..), Strict(..))
 
 #ifdef MIN_VERSION_attoparsec
-import Data.ByteString (ByteString)
-import Data.Text (Text)
-import qualified Data.ByteString as ByteString
-import qualified Data.ByteString.Char8 as ByteString.Char8
-import qualified Data.Text as Text
-
 import qualified Data.Attoparsec.ByteString as Attoparsec
-import qualified Data.Attoparsec.ByteString.Char8 as Attoparsec.Char8
 import qualified Data.Attoparsec.Text as Attoparsec.Text
 #endif
 
 #ifdef MIN_VERSION_binary
-import Data.ByteString (ByteString)
-import qualified Data.ByteString as ByteString
-import qualified Data.ByteString.Lazy as Lazy
-
 import qualified Data.Binary.Get as Binary
 #endif
 
diff --git a/src/Text/Parser/Input.hs b/src/Text/Parser/Input.hs
--- a/src/Text/Parser/Input.hs
+++ b/src/Text/Parser/Input.hs
@@ -4,6 +4,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 
 #if defined (__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 802
 {-# LANGUAGE TypeSynonymInstances #-}
@@ -14,30 +15,26 @@
 module Text.Parser.Input (InputParsing(..), InputCharParsing(..), ConsumedInputParsing(..),
                           Lazy(..), Strict(..)) where
 
-import Control.Applicative (Applicative ((<*>), pure), Alternative ((<|>), empty), (<**>))
+import Control.Applicative (Alternative ((<|>), empty))
 import Control.Monad (MonadPlus, void)
 import Control.Monad.Trans.Class (lift)
 import Control.Monad.Trans.Identity (IdentityT(..))
 import Control.Monad.Trans.Reader (ReaderT(..), mapReaderT)
-import qualified Control.Monad.Trans.Writer.Lazy as Lazy (WriterT(WriterT))
-import qualified Control.Monad.Trans.Writer.Strict as Strict (WriterT(WriterT))
-import qualified Control.Monad.Trans.State.Lazy as Lazy (StateT(StateT))
-import qualified Control.Monad.Trans.State.Strict as Strict (StateT(StateT))
-import qualified Control.Monad.Trans.RWS.Lazy as Lazy (RWST(RWST))
-import qualified Control.Monad.Trans.RWS.Strict as Strict (RWST(RWST))
+import qualified Control.Monad.Trans.Writer.Lazy as Lazy (WriterT)
+import qualified Control.Monad.Trans.Writer.Strict as Strict (WriterT)
+import qualified Control.Monad.Trans.State.Lazy as Lazy (StateT)
+import qualified Control.Monad.Trans.State.Strict as Strict (StateT)
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy (RWST)
+import qualified Control.Monad.Trans.RWS.Strict as Strict (RWST)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as ByteString
 import qualified Data.ByteString.Lazy as Lazy
-import Data.Functor ((<$>))
-import qualified Data.List as List
 import Data.Ord (Down)
-import Data.Monoid (Monoid, (<>))
-import Data.String (IsString (fromString))
 import Text.ParserCombinators.ReadP (ReadP)
 import qualified Text.ParserCombinators.ReadP as ReadP
 
 import Text.Parser.Char (CharParsing)
-import Text.Parser.Combinators (Parsing, count, eof, notFollowedBy, try, unexpected)
+import Text.Parser.Combinators (count, eof, notFollowedBy, try, unexpected)
 import Text.Parser.LookAhead (LookAheadParsing, lookAhead)
 import qualified Text.Parser.Char as Char
 
@@ -68,7 +65,7 @@
 import qualified Data.Binary.Get as Binary
 #endif
 
-import Text.Parser.Input.Position (Position, fromEnd, fromStart)
+import Text.Parser.Input.Position (fromEnd, fromStart)
 import Text.Parser.Internal (mapLazyWriterT, mapStrictWriterT,
                              mapLazyStateT, mapStrictStateT,
                              mapLazyRWST, mapStrictRWST)
diff --git a/src/Text/Parser/Input/Position.hs b/src/Text/Parser/Input/Position.hs
--- a/src/Text/Parser/Input/Position.hs
+++ b/src/Text/Parser/Input/Position.hs
@@ -6,7 +6,6 @@
 
 import Data.Char (isSpace)
 import Data.String (IsString(fromString))
-import Data.Monoid ((<>))
 import Data.Ord (Down(Down))
 import qualified Data.Monoid.Factorial as Factorial
 import qualified Data.Monoid.Textual as Textual
@@ -32,8 +31,11 @@
 
 instance Position a => Position (Down a) where
    distance (Down p1) (Down p2) = distance p2 p1
-   move distance (Down p) = Down (move (negate distance) p)
+   move dist (Down p) = Down (move (negate dist) p)
    offset wholeInput (Down p) = Factorial.length wholeInput - offset wholeInput p
+   {-# INLINE distance #-}
+   {-# INLINE move #-}
+   {-# INLINE offset #-}
 
 -- | Construct a 'Position' given the offset from the beginning of the full input.
 fromStart :: Int -> Int
@@ -59,12 +61,12 @@
 -- | Given the full input and an offset within it, returns all the input lines up to and including the offset
 -- in reverse order, as well as the zero-based column number of the offset
 lineAndColumn :: (Eq s, IsString s, FactorialMonoid s, Position p) => s -> p -> ([s], Int)
-lineAndColumn input pos = context [] (offset input pos) (Factorial.split (== "\n") input)
-  where context revLines restCount []
+lineAndColumn input pos = go [] (offset input pos) (Factorial.split (== "\n") input)
+  where go revLines restCount []
           | restCount > 0 = (["Error: the offset is beyond the input length"], -1)
           | otherwise = (revLines, restCount)
-        context revLines restCount (next:rest)
+        go revLines restCount (next:rest)
           | restCount' < 0 = (next:revLines, restCount)
-          | otherwise = context (next:revLines) restCount' rest
+          | otherwise = go (next:revLines) restCount' rest
           where nextLength = Factorial.length next
                 restCount' = restCount - nextLength - 1
diff --git a/src/Text/Parser/Internal.hs b/src/Text/Parser/Internal.hs
--- a/src/Text/Parser/Internal.hs
+++ b/src/Text/Parser/Internal.hs
@@ -1,6 +1,6 @@
 module Text.Parser.Internal where
 
-import Control.Applicative (Applicative, liftA2)
+import Control.Applicative (liftA2)
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy (WriterT(WriterT))
 import qualified Control.Monad.Trans.Writer.Strict as Strict (WriterT(WriterT))
 import qualified Control.Monad.Trans.State.Lazy as Lazy (StateT(StateT))
@@ -32,5 +32,8 @@
 mapStrictRWST f (Strict.RWST p) = Strict.RWST (\r-> apply . p r)
    where apply m = liftA2 replaceFstOf3 (f $ fstOf3 <$> m) m
 
-fstOf3 (a, b, c) = a
+fstOf3 :: (a, b, c) -> a
+fstOf3 (a, _, _) = a
+
+replaceFstOf3 :: a -> (x, b, c) -> (a, b, c)
 replaceFstOf3 a (_, b, c) = (a, b, c)
diff --git a/src/Text/Parser/Wrapper.hs b/src/Text/Parser/Wrapper.hs
--- a/src/Text/Parser/Wrapper.hs
+++ b/src/Text/Parser/Wrapper.hs
@@ -4,7 +4,7 @@
 
 module Text.Parser.Wrapper where
 
-import Control.Applicative (Applicative, Alternative)
+import Control.Applicative (Alternative)
 import Control.Monad (MonadPlus)
 import Text.Parser.Combinators (Parsing)
 import Text.Parser.LookAhead (LookAheadParsing)
