diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/htoml-megaparsec.cabal b/htoml-megaparsec.cabal
--- a/htoml-megaparsec.cabal
+++ b/htoml-megaparsec.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.0
 name: htoml-megaparsec
-version: 2.0.0.2
+version: 2.1.0.0
 license: BSD3
 license-file: LICENSE
 copyright: (c) 2013-2016 Cies Breijs, 2017-2018 Vanessa McHale
@@ -35,7 +35,7 @@
     hs-source-dirs: src
     default-language: Haskell2010
     other-extensions: ConstraintKinds DeriveGeneric FlexibleContexts
-                      OverloadedStrings RankNTypes GADTs MonoLocalBinds
+                      OverloadedStrings RankNTypes GADTs MonoLocalBinds DeriveAnyClass
     ghc-options: -Wall
     build-depends:
         base >=4.8 && <5,
@@ -62,7 +62,7 @@
     build-depends:
         base >=4.7 && <5,
         containers >=0.5,
-        megaparsec >=6.0.0,
+        megaparsec >=7.0.0,
         unordered-containers >=0.2,
         vector >=0.10,
         text >=1.0 && <2,
@@ -85,14 +85,12 @@
         BurntSushi
         JSON
         Text.Toml.Parser.Spec
-        Text.TomlSpec
     default-language: Haskell2010
     ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
     build-depends:
         base >=4.9 && <5,
         megaparsec -any,
         containers -any,
-        hspec -any,
         unordered-containers -any,
         vector -any,
         aeson -any,
diff --git a/internal/Text/Megaparsec/CharRW.hs b/internal/Text/Megaparsec/CharRW.hs
--- a/internal/Text/Megaparsec/CharRW.hs
+++ b/internal/Text/Megaparsec/CharRW.hs
@@ -6,14 +6,14 @@
                               ) where
 
 import           Data.Foldable        (Foldable)
-import           Text.Megaparsec
-import           Text.Megaparsec.Char as X hiding (noneOf, oneOf)
-import qualified Text.Megaparsec.Char as Megaparsec
+import           Text.Megaparsec      hiding (noneOf, oneOf)
+import qualified Text.Megaparsec      as Megaparsec
+import           Text.Megaparsec.Char as X
 
 {-# RULES
-"noneOf/char"       forall c.    noneOf [c]     = char 'c'
+"noneOf/char"       forall c.    noneOf [c]     = anySingleBut 'c'
 "noneOf/satsify"    forall c c'. noneOf [c, c'] = satisfy (\x -> x /= c && x /= c')
-"oneOf/notChar"     forall c.    oneOf [c]      = notChar 'c'
+"oneOf/notChar"     forall c.    oneOf [c]      = char 'c'
 "oneOf/satisfy"     forall c c'. oneOf [c, c']  = satisfy (\x -> x == c || x == c')
   #-}
 
diff --git a/internal/Text/Toml/Parser.hs b/internal/Text/Toml/Parser.hs
--- a/internal/Text/Toml/Parser.hs
+++ b/internal/Text/Toml/Parser.hs
@@ -20,11 +20,11 @@
 import qualified Data.Vector            as V
 import           Data.Void
 import           Numeric                (readHex)
-import           Text.Megaparsec
+import           Text.Megaparsec        hiding (noneOf, oneOf)
 import           Text.Megaparsec.CharRW
 import           Text.Toml.Types
 
-type TomlError = ParseError (Token Text) Void
+type TomlError = ParseErrorBundle Text Void
 
 -- | Convenience function for the test suite and GHCI.
 parseOnly :: Parser Toml a -> Text -> Either TomlError a
@@ -142,14 +142,12 @@
 boolean = VBoolean <$> ( string "true"  $> True  <|>
                          string "false" $> False )
 
-
 anyStr :: (TomlM m) => Parser m Node
 anyStr = VString <$> anyStr'
 
 anyStr' :: (TomlM m) => Parser m Text
 anyStr' = try multiBasicStr <|> try basicStr <|> try multiLiteralStr <|> literalStr
 
-
 basicStr :: (TomlM m) => Parser m Text
 basicStr = between dQuote dQuote (pack <$> many strChar)
   where
@@ -174,24 +172,21 @@
   where
     sQuote = char '\''
 
-
 multiLiteralStr :: (TomlM m) => Parser m Text
-multiLiteralStr = openSQuote3 *> (pack <$> manyTill anyChar sQuote3)
+multiLiteralStr = openSQuote3 *> (pack <$> manyTill anySingle sQuote3)
   where
     -- | Parse the a tripple-single quote, with possibly a newline attached
     openSQuote3 = try (sQuote3 <* char '\n') <|> sQuote3
     -- | Parse tripple-single quotes
     sQuote3     = try . count 3 . char $ '\''
 
-
 datetime :: (TomlM m) => Parser m Node
 datetime = do
-    d <- manyTill anyChar (char 'Z')
+    d <- manyTill anySingle (char 'Z')
     let  mt = parseTimeM True defaultTimeLocale (iso8601DateFormat $ Just "%X") d
     case mt of Just t  -> return $ VDatetime t
                Nothing -> throwParser "parsing datetime failed"
 
-
 -- | Attoparsec 'double' parses scientific "e" notation; reimplement according to Toml spec.
 float :: (TomlM m) => Parser m Node
 float = VFloat <$> do
@@ -206,7 +201,6 @@
                  u <- uintStr
                  return . join $ s : [u]
 
-
 integer :: (TomlM m) => Parser m Node
 integer = VInteger <$> signed (read <$> uintStr)
   where
@@ -225,7 +219,6 @@
     separatedValues = sepEndBy (skipBlanks *> try p <* skipBlanks) comma <* skipBlanks
     comma           = skipBlanks >> char ',' >> skipBlanks
 
-
 -- | Parser for escape sequences.
 escSeq :: (TomlM m) => Parser m Char
 escSeq = char '\\' *> escSeqChar
@@ -242,7 +235,6 @@
               <|> char 'U' *> unicodeHex 8
               <?> "escaped character"
 
-
 -- | Parser for unicode hexadecimal values of representation length 'n'.
 unicodeHex :: (TomlM m) => Int -> Parser m Char
 unicodeHex n = do
@@ -253,21 +245,18 @@
     -- isHex x = or . sequence [isDigit, isAsciiUpper, isAsciiLower]
     maxChar = fromEnum (maxBound :: Char)
 
-
 -- | Parser for signs (a plus or a minus).
 signed :: (Num a, TomlM m) => Parser m a -> Parser m a
 signed p = p
         <|> (negate <$> (char '-' *> p))
         <|> (char '+' *> p)
 
-
 -- | Parses the (rest of the) line including an EOF, whitespace and comments.
 skipBlanks :: (TomlM m) => Parser m ()
 skipBlanks = skipMany blank
   where
     blank   = void (some (satisfy isSpc)) <|> comment <|> void eol
-    comment = char '#' >> void (many $ noneOf ("\n" :: String))
-
+    comment = char '#' *> void (many $ noneOf ("\n" :: String))
 
 -- | Results in 'True' for whitespace chars, tab or space, according to spec.
 isSpc :: Char -> Bool
diff --git a/internal/Text/Toml/Types.hs b/internal/Text/Toml/Types.hs
--- a/internal/Text/Toml/Types.hs
+++ b/internal/Text/Toml/Types.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE ConstraintKinds   #-}
 {-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE DeriveAnyClass     #-}
 {-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes        #-}
@@ -69,14 +70,11 @@
           | VBoolean  Bool
           | VDatetime UTCTime
           | VArray    VArray
-  deriving (Eq, Show, Generic)
-
-instance NFData Node where
+  deriving (Show, Eq, Generic, NFData)
 
 -- | To mark whether or not a 'Table' has been explicitly defined.
 -- See: https://github.com/toml-lang/toml/issues/376
 data Explicitness = Explicit | Implicit
-  deriving (Eq, Show)
 
 -- | Convenience function to get a boolean value.
 isExplicit :: Explicitness -> Bool
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -2,14 +2,11 @@
 import           Test.Tasty            (defaultMain, testGroup)
 
 import qualified BurntSushi
-import           Test.Hspec
 import           Text.Toml.Parser.Spec
-import           Text.TomlSpec
 
 
 main :: IO ()
 main = do
-  hspec hspecTests
   parserSpec <- tomlParserSpec
   bsTests <- BurntSushi.tests
 
diff --git a/test/Text/TomlSpec.hs b/test/Text/TomlSpec.hs
deleted file mode 100644
--- a/test/Text/TomlSpec.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
-module Text.TomlSpec (hspecTests) where
-
-import           Data.List.NonEmpty
-import qualified Data.Set           as Set
-import           Test.Hspec
-import           Text.Megaparsec
-import           Text.Toml
-
-hspecTests :: Spec
-hspecTests =
-  describe "parser" $
-  it "should not parse re-assignment of key" $ do
-  let actual = parseTomlDoc "noSrc" "q={k=42, k=43}\nd=str"
-  actual `shouldBe` Left (FancyError (SourcePos "noSrc" (mkPos 1) (mkPos 15) :| []) (Set.fromList [ErrorFail "Cannot redefine key k"]))
