diff --git a/library/YamlUnscrambler.hs b/library/YamlUnscrambler.hs
--- a/library/YamlUnscrambler.hs
+++ b/library/YamlUnscrambler.hs
@@ -68,7 +68,7 @@
 where
 
 import qualified Attoparsec.Time.ByteString as AsciiAtto
-import qualified Control.Foldl as Fold
+import qualified Control.Selective.Trans.Except as Selective.ExceptT
 import qualified Data.Attoparsec.ByteString.Char8 as AsciiAtto
 import qualified Data.Attoparsec.Text as TextAtto
 import qualified Data.ByteString as ByteString
@@ -80,7 +80,6 @@
 import qualified Data.Text.Encoding as Text
 import qualified Data.UUID as UUID
 import qualified Data.Vector as Vector
-import qualified Data.Vector.Generic as GenericVector
 import qualified Data.Yaml.Parser as Yaml
 import qualified Text.Libyaml as Libyaml
 import qualified YamlUnscrambler.AsciiAtto as AsciiAtto
@@ -91,7 +90,6 @@
 import YamlUnscrambler.Prelude hiding (String)
 import qualified YamlUnscrambler.Util.ByteString as ByteString
 import qualified YamlUnscrambler.Util.HashMap as HashMap
-import qualified YamlUnscrambler.Util.Text as Text
 import qualified YamlUnscrambler.Util.Vector as Vector
 import qualified YamlUnscrambler.Util.Yaml as Yaml
 
@@ -498,7 +496,7 @@
   select (ByKey le lp) (ByKey re rp) =
     ByKey
       (Ex.BothByKey le re)
-      (\a b c d -> select (lp a b c d) (rp a b c d))
+      (\a b c d -> Selective.ExceptT.unwrap (select (Selective.ExceptT.ExceptT (lp a b c d)) (Selective.ExceptT.ExceptT (rp a b c d))))
 
 instance Alternative (ByKey key) where
   empty =
diff --git a/library/YamlUnscrambler/AsciiAtto.hs b/library/YamlUnscrambler/AsciiAtto.hs
--- a/library/YamlUnscrambler/AsciiAtto.hs
+++ b/library/YamlUnscrambler/AsciiAtto.hs
@@ -1,6 +1,5 @@
 module YamlUnscrambler.AsciiAtto where
 
-import Attoparsec.Time.ByteString
 import Data.Attoparsec.ByteString.Char8
 import YamlUnscrambler.Model
 import YamlUnscrambler.Prelude
diff --git a/library/YamlUnscrambler/CompactErrRendering.hs b/library/YamlUnscrambler/CompactErrRendering.hs
--- a/library/YamlUnscrambler/CompactErrRendering.hs
+++ b/library/YamlUnscrambler/CompactErrRendering.hs
@@ -15,20 +15,30 @@
 renderErrAtPath =
   buildText . errAtPath
 
+path :: [Text] -> TextBuilder
 path a =
   "/" <> intercalate "/" (fmap text a)
 
+errAtPath :: Err.ErrAtPath -> TextBuilder
 errAtPath (Err.ErrAtPath a b) =
   "Error at path " <> path a <> ". " <> reason b
 
+reason :: Err.Err -> TextBuilder
 reason =
   \case
     Err.KeyErr a b c ->
-      text c <> ". On input: " <> string (show b) <> ". "
+      text c
+        <> ". On input: "
+        <> string (show b)
+        <> ". "
         <> "Expecting: "
         <> stringExpectation a
     Err.NoneOfMappingKeysFoundErr a b c d ->
-      "None of keys found " <> caseSensitively b <> ": " <> string (show d) <> ". "
+      "None of keys found "
+        <> caseSensitively b
+        <> ": "
+        <> string (show d)
+        <> ". "
         <> "Keys available: "
         <> string (show c)
     Err.NoneOfSequenceKeysFoundErr a b ->
@@ -47,10 +57,13 @@
     Err.UnknownAnchorErr a ->
       "Unknown anchor: " <> text a
     Err.NotEnoughElementsErr a b ->
-      "Not enough elements: " <> decimal b <> ". "
+      "Not enough elements: "
+        <> decimal b
+        <> ". "
         <> "Expecting: "
         <> byOrderExpectation a
 
+scalarExpectation :: Ex.Scalar -> TextBuilder
 scalarExpectation =
   \case
     Ex.StringScalar a ->
@@ -80,6 +93,7 @@
     Ex.Base64BinaryScalar ->
       "binary data in Base-64"
 
+stringExpectation :: Ex.String -> TextBuilder
 stringExpectation =
   \case
     Ex.AnyString ->
@@ -89,8 +103,9 @@
     Ex.FormattedString a ->
       text a
 
+byOrderExpectation :: Ex.ByOrder -> TextBuilder
 byOrderExpectation =
-  decimal . count 0
+  decimal @Integer . count 0
   where
     count !a =
       \case
@@ -109,15 +124,19 @@
         Ex.FetchByOrder _ ->
           count (succ a) c
 
+caseSensitive :: CaseSensitive -> TextBuilder
 caseSensitive (CaseSensitive a) =
   "case-" <> bool "insensitive" "sensitive" a
 
+caseSensitively :: CaseSensitive -> TextBuilder
 caseSensitively (CaseSensitive a) =
   "case-" <> bool "insensitively" "sensitively" a
 
+signed :: Signed -> TextBuilder
 signed (Signed a) =
   bool "unsigned" "signed" a
 
+numeralSystem :: NumeralSystem -> TextBuilder
 numeralSystem =
   \case
     DecimalNumeralSystem ->
@@ -125,5 +144,6 @@
     HexadecimalNumeralSystem ->
       "hexadecimal"
 
+maxInputSize :: MaxInputSize -> TextBuilder
 maxInputSize (MaxInputSize a) =
   decimal a
diff --git a/library/YamlUnscrambler/Prelude.hs b/library/YamlUnscrambler/Prelude.hs
--- a/library/YamlUnscrambler/Prelude.hs
+++ b/library/YamlUnscrambler/Prelude.hs
@@ -91,12 +91,11 @@
 import System.Mem as Exports
 import System.Mem.StableName as Exports
 import System.Timeout as Exports
-import Text.ParserCombinators.ReadP as Exports (ReadP, ReadS, readP_to_S, readS_to_P)
 import Text.ParserCombinators.ReadPrec as Exports (ReadPrec, readP_to_Prec, readPrec_to_P, readPrec_to_S, readS_to_Prec)
 import Text.Printf as Exports (hPrintf, printf)
 import Text.Read as Exports (Read (..), readEither, readMaybe)
 import Unsafe.Coerce as Exports
 import Prelude as Exports hiding (all, and, any, concat, concatMap, elem, fail, foldl, foldl1, foldr, foldr1, id, mapM, mapM_, maximum, minimum, notElem, or, product, sequence, sequence_, sum, (.))
 
-showAsText :: Show a => a -> Text
+showAsText :: (Show a) => a -> Text
 showAsText = show >>> fromString
diff --git a/library/YamlUnscrambler/Util/ByteString.hs b/library/YamlUnscrambler/Util/ByteString.hs
--- a/library/YamlUnscrambler/Util/ByteString.hs
+++ b/library/YamlUnscrambler/Util/ByteString.hs
@@ -4,6 +4,7 @@
 import YamlUnscrambler.Prelude hiding (length, map)
 import qualified YamlUnscrambler.Util.Word8 as Word8
 
+lowercaseInAscii :: ByteString -> ByteString
 lowercaseInAscii =
   map Word8.lowercaseInAscii
 
diff --git a/library/YamlUnscrambler/Util/HashMap.hs b/library/YamlUnscrambler/Util/HashMap.hs
--- a/library/YamlUnscrambler/Util/HashMap.hs
+++ b/library/YamlUnscrambler/Util/HashMap.hs
@@ -3,6 +3,6 @@
 import Data.HashMap.Strict
 import YamlUnscrambler.Prelude hiding (lookup)
 
-lookupFirst :: (Hashable k, Eq k) => [k] -> HashMap k v -> Maybe (k, v)
+lookupFirst :: (Hashable k) => [k] -> HashMap k v -> Maybe (k, v)
 lookupFirst keys map =
   getFirst (foldMap (\k -> First (fmap (k,) (lookup k map))) keys)
diff --git a/library/YamlUnscrambler/Util/List.hs b/library/YamlUnscrambler/Util/List.hs
--- a/library/YamlUnscrambler/Util/List.hs
+++ b/library/YamlUnscrambler/Util/List.hs
@@ -1,7 +1,5 @@
 module YamlUnscrambler.Util.List where
 
-import YamlUnscrambler.Prelude hiding (lookup)
-
 firstNonEmpty :: [a] -> [a] -> [a]
 firstNonEmpty a b =
   case a of
diff --git a/library/YamlUnscrambler/Util/Yaml.hs b/library/YamlUnscrambler/Util/Yaml.hs
--- a/library/YamlUnscrambler/Util/Yaml.hs
+++ b/library/YamlUnscrambler/Util/Yaml.hs
@@ -1,8 +1,6 @@
 module YamlUnscrambler.Util.Yaml where
 
 import qualified Conduit
-import qualified Data.Text.Encoding as Text
-import qualified Data.Yaml as Yaml
 import qualified Data.Yaml.Parser as YamlParser
 import qualified Text.Libyaml as Libyaml
 import YamlUnscrambler.Prelude
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,17 +2,14 @@
 
 import qualified Control.Foldl as Fold
 import qualified Data.Text as Text
-import GHC.Exts (fromList)
 import qualified NeatInterpolation as NeatInterpolation
-import qualified Test.QuickCheck as QuickCheck
-import Test.QuickCheck.Instances
+import Test.QuickCheck.Instances ()
 import Test.Tasty
 import Test.Tasty.HUnit
-import Test.Tasty.QuickCheck
-import Test.Tasty.Runners
 import qualified YamlUnscrambler as U
 import Prelude hiding (assert)
 
+main :: IO ()
 main =
   defaultMain $
     testGroup
@@ -33,12 +30,12 @@
                             fmap Just $ U.boundedIntegerScalar @Int (U.Signed True) U.DecimalNumeralSystem
               input =
                 [NeatInterpolation.text|
-          a: 2
-          b: 3
-          c:
-            - 1
-            - 2
-          |]
+                  a: 2
+                  b: 3
+                  c:
+                    - 1
+                    - 2
+                |]
            in case U.parseText unscrambler input of
                 Right res ->
                   assertFailure (show res)
@@ -70,13 +67,13 @@
                         fmap Just $ U.boundedIntegerScalar @Int (U.Signed True) U.DecimalNumeralSystem
               input =
                 [NeatInterpolation.text|
-          sums:
-            A:
-              a:
-                - Int
-                - Bool
-              b: Char, Double
-          |]
+                  sums:
+                    A:
+                      a:
+                        - Int
+                        - Bool
+                      b: Char, Double
+                |]
            in case U.parseText unscrambler input of
                 Right res ->
                   assertFailure (show res)
@@ -108,11 +105,11 @@
                         fmap Just $ U.stringScalar U.textString
               input =
                 [NeatInterpolation.text|
-          sums:
-            A:
-              a: Text
-              b: Int
-          |]
+                  sums:
+                    A:
+                      a: Text
+                      b: Int
+                |]
            in case U.parseText unscrambler input of
                 Right res ->
                   assertEqual "" (Just [("A", [("a", Just "Text"), ("b", Just "Int")])]) res
@@ -144,11 +141,11 @@
                         fmap Just $ U.boundedIntegerScalar @Int (U.Signed True) U.DecimalNumeralSystem
               input =
                 [NeatInterpolation.text|
-          sums:
-            A:
-              a: Int
-              b: Char
-          |]
+                  sums:
+                    A:
+                      a: Int
+                      b: Char
+                |]
            in case U.parseText unscrambler input of
                 Right res ->
                   assertFailure (show res)
diff --git a/yaml-unscrambler.cabal b/yaml-unscrambler.cabal
--- a/yaml-unscrambler.cabal
+++ b/yaml-unscrambler.cabal
@@ -1,28 +1,69 @@
-name: yaml-unscrambler
-version: 0.1.0.13
-synopsis: Flexible declarative YAML parsing toolkit
-stability: Experimental
-homepage: https://github.com/nikita-volkov/yaml-unscrambler
-bug-reports: https://github.com/nikita-volkov/yaml-unscrambler/issues
-author: Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
-copyright: (c) 2020 Nikita Volkov
-license: MIT
-license-file: LICENSE
-build-type: Simple
-cabal-version: >=1.10
+cabal-version: 3.0
+name:          yaml-unscrambler
+version:       0.1.0.14
+synopsis:      Flexible declarative YAML parsing toolkit
+homepage:      https://github.com/nikita-volkov/yaml-unscrambler
+bug-reports:   https://github.com/nikita-volkov/yaml-unscrambler/issues
+author:        Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer:    Nikita Volkov <nikita.y.volkov@mail.ru>
+copyright:     (c) 2020 Nikita Volkov
+license:       MIT
+license-file:  LICENSE
 
 source-repository head
-  type: git
+  type:     git
   location: git://github.com/nikita-volkov/yaml-unscrambler.git
 
+common base
+  default-language:   Haskell2010
+  default-extensions:
+    NoImplicitPrelude
+    NoMonomorphismRestriction
+    BangPatterns
+    ConstraintKinds
+    DataKinds
+    DefaultSignatures
+    DeriveDataTypeable
+    DeriveFoldable
+    DeriveFunctor
+    DeriveGeneric
+    DeriveTraversable
+    EmptyDataDecls
+    FlexibleContexts
+    FlexibleInstances
+    FunctionalDependencies
+    GADTs
+    GeneralizedNewtypeDeriving
+    InstanceSigs
+    LambdaCase
+    LiberalTypeSynonyms
+    MagicHash
+    MultiParamTypeClasses
+    MultiWayIf
+    OverloadedStrings
+    ParallelListComp
+    PatternGuards
+    QuasiQuotes
+    RankNTypes
+    RecordWildCards
+    ScopedTypeVariables
+    StandaloneDeriving
+    StrictData
+    TemplateHaskell
+    TupleSections
+    TypeApplications
+    TypeFamilies
+    TypeOperators
+    UnboxedTuples
+    ViewPatterns
+
 library
-  hs-source-dirs: library
-  default-extensions: BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, InstanceSigs, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples, ViewPatterns
-  default-language: Haskell2010
+  import:          base
+  hs-source-dirs:  library
   exposed-modules:
     YamlUnscrambler
     YamlUnscrambler.Expectations
+
   other-modules:
     YamlUnscrambler.AsciiAtto
     YamlUnscrambler.CompactErrRendering
@@ -30,51 +71,49 @@
     YamlUnscrambler.Model
     YamlUnscrambler.Prelude
     YamlUnscrambler.Util.ByteString
-    YamlUnscrambler.Util.Maybe
     YamlUnscrambler.Util.HashMap
     YamlUnscrambler.Util.List
-    YamlUnscrambler.Util.Yaml
-    YamlUnscrambler.Util.Word8
+    YamlUnscrambler.Util.Maybe
     YamlUnscrambler.Util.Text
     YamlUnscrambler.Util.Vector
+    YamlUnscrambler.Util.Word8
+    YamlUnscrambler.Util.Yaml
+
   build-depends:
-    acc >=0.2.0.1 && <0.3,
-    attoparsec >=0.13 && <0.15,
-    attoparsec-data >=1.0.5.2 && <1.1,
-    attoparsec-time >=1.0.1.2 && <1.1,
-    base >=4.11 && <5,
-    base64-bytestring >=1.2.1 && <1.3,
-    bytestring >=0.10 && <0.12,
-    conduit >=1.3.2 && <1.4,
-    containers >=0.6.2 && <0.7,
-    foldl >=1.4 && <2,
-    hashable >=1 && <2,
-    libyaml >=0.1.2 && <0.2,
-    mtl >=2.2 && <3,
-    scientific >=0.3.6.2 && <0.4,
-    selective >=0.5 && <0.7,
-    text >=1 && <3,
-    text-builder-dev >=0.3 && <0.4,
-    time >=1.9 && <2,
-    transformers >=0.5 && <0.7,
-    unordered-containers >=0.2.10 && <0.3,
-    uuid >=1.3 && <2,
-    vector >=0.12 && <0.14,
-    yaml >=0.11.5 && <0.12
+    , acc >=0.2.0.1 && <0.3
+    , attoparsec >=0.14 && <0.15
+    , attoparsec-data >=1.0.5.2 && <1.1
+    , attoparsec-time >=1.0.1.2 && <1.1
+    , base >=4.13 && <5
+    , base64-bytestring >=1.2.1 && <1.3
+    , bytestring >=0.10 && <0.12
+    , conduit >=1.3.2 && <1.4
+    , containers >=0.6.2 && <0.7
+    , foldl >=1.4 && <2
+    , hashable >=1.4 && <2
+    , libyaml >=0.1.2 && <0.2
+    , mtl >=2.2 && <3
+    , scientific >=0.3.6.2 && <0.4
+    , selective >=0.6 && <0.7
+    , text >=1 && <3
+    , text-builder-dev >=0.3 && <0.4
+    , time >=1.9 && <2
+    , transformers >=0.5 && <0.7
+    , unordered-containers >=0.2.10 && <0.3
+    , uuid >=1.3 && <2
+    , vector >=0.12 && <0.14
+    , yaml >=0.11.5 && <0.12
 
 test-suite test
-  type: exitcode-stdio-1.0
+  import:         base
+  type:           exitcode-stdio-1.0
   hs-source-dirs: test
-  default-extensions: BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, InstanceSigs, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples, ViewPatterns
-  default-language: Haskell2010
-  main-is: Main.hs
+  main-is:        Main.hs
   build-depends:
-    foldl >=1.4.9 && <2,
-    neat-interpolation >=0.5.1.2 && <0.6,
-    QuickCheck >=2.8.1 && <3,
-    quickcheck-instances >=0.3.11 && <0.4,
-    rerebase >=1.14 && <2,
-    tasty >=0.12 && <2,
-    tasty-hunit >=0.9 && <0.11,
-    tasty-quickcheck >=0.9 && <0.11,
-    yaml-unscrambler
+    , foldl >=1.4.9 && <2
+    , neat-interpolation >=0.5.1.2 && <0.6
+    , quickcheck-instances >=0.3.11 && <0.4
+    , rerebase >=1.14 && <2
+    , tasty >=0.12 && <2
+    , tasty-hunit >=0.9 && <0.11
+    , yaml-unscrambler
