diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for multi-except
 
+## 0.2.0.0 -- 2021-05-29
+
+* Changed order of type variables in `succeed`
+* Now required GHC >= 6.8.1 due to ScopedTypeVariables usage
+
 ## 0.1.4.0 -- 2021-05-26
 
 * Added join, fromEitherPoly, throwErrors
diff --git a/Control/Applicative/MultiExcept.hs b/Control/Applicative/MultiExcept.hs
--- a/Control/Applicative/MultiExcept.hs
+++ b/Control/Applicative/MultiExcept.hs
@@ -7,6 +7,8 @@
 Portability : portable
 -}
 
+{-# LANGUAGE ScopedTypeVariables #-}
+
 module Control.Applicative.MultiExcept
   ( MultiExcept
   , fromEither
@@ -20,7 +22,6 @@
 
 import Data.Functor.Alt
 import Data.DList.DNonEmpty (DNonEmpty)
-import qualified Data.DList.DNonEmpty as DNE
 import Data.List.NonEmpty (NonEmpty)
 
 -- | A 'MultiExcept' is a success value, or one or more errors.
@@ -30,21 +31,21 @@
   deriving (Eq, Ord, Read, Show)
 
 -- | Run the computation.
-runMultiExcept :: MultiExcept err a -> Either (NonEmpty err) a
-runMultiExcept (Errors errs) = Left $ DNE.toNonEmpty errs
+runMultiExcept :: MultiExcept err a -> Either (DNonEmpty err) a
+runMultiExcept (Errors errs) = Left errs
 runMultiExcept (Success a) = Right a
 
 -- | Throw a single error.
-throwError :: err -> MultiExcept err a
+throwError :: forall a err. err -> MultiExcept err a
 throwError = Errors . pure
 
 -- | Throw one or more errors.
-throwErrors :: DNonEmpty err -> MultiExcept err a
+throwErrors :: forall a err. DNonEmpty err -> MultiExcept err a
 throwErrors = Errors
 
 -- | Embeds a value into a 'MultiExcept' context.
-succeed :: a -> MultiExcept err a
-succeed a = Success a
+succeed :: forall err a. a -> MultiExcept err a
+succeed = Success
 
 -- | Convert an 'Either' to a 'MultiExcept'.
 fromEither :: Either err a -> MultiExcept err a
diff --git a/multi-except.cabal b/multi-except.cabal
--- a/multi-except.cabal
+++ b/multi-except.cabal
@@ -1,7 +1,7 @@
 cabal-version:       >=1.10
 
 name:                multi-except
-version:             0.1.4.0
+version:             0.2.0.0
 synopsis:            Multiple Exceptions
 description:         Exception type that supports reporting multiple exceptions
 license:             MIT
@@ -19,3 +19,14 @@
                      , dlist
                      , semigroupoids
   default-language:    Haskell2010
+
+test-suite unit-tests
+  type:               exitcode-stdio-1.0
+  hs-source-dirs:     test
+  main-is:            Main.hs
+  default-language:   Haskell2010
+  other-modules:      Test.Functor
+                    , Test.Applicative
+  build-depends:      base
+                    , multi-except
+                    , hspec
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,14 @@
+module Main where
+
+import Test.Hspec
+
+import qualified Test.Applicative
+import qualified Test.Functor
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  Test.Functor.spec
+  Test.Applicative.spec
diff --git a/test/Test/Applicative.hs b/test/Test/Applicative.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Applicative.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TupleSections #-}
+
+module Test.Applicative
+  ( spec
+  ) where
+
+import Test.Hspec
+
+import Control.Applicative.MultiExcept
+
+testErrors :: MultiExcept Int Int
+testErrors = fromEitherPoly $ Left [2, 3]
+
+spec :: Spec
+spec = describe "Applicative instance" $ do
+  describe "pure" $
+    it "succeeds" $
+      pure 5 `shouldBe` (succeed 5 :: MultiExcept () Int)
+  describe "<*>" $ do
+    it "accumulates errors" $
+      throwError 2 <*> throwError 3 `shouldBe` testErrors
+    it "propagates successes" $
+      (,) <$> pure 3 <*> pure 4 `shouldBe` succeed @() (3, 4)
+    it "errors when only one side is successful" $ do
+      succeed (+ 1) <*> testErrors `shouldBe` testErrors
+      throwError 2 <*> succeed () `shouldBe` throwError @Int 2
diff --git a/test/Test/Functor.hs b/test/Test/Functor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Functor.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Test.Functor
+  ( spec
+  ) where
+
+import Test.Hspec
+
+import Control.Applicative.MultiExcept
+
+testErrors :: MultiExcept Int Int
+testErrors = fromEitherPoly (Left [2, 3])
+
+spec :: Spec
+spec = describe "Functor instance" $ do
+  it "transforms success value" $
+    ((+ 3) <$> succeed 2) `shouldBe` (succeed 5 :: MultiExcept () Int)
+  it "doesn't affect errors" $ do
+    fmap (+ 3) testErrors `shouldBe` testErrors
