diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,2 +1,7 @@
-import Distribution.Simple
-main = defaultMain
+module Main (main) where
+
+import RIO
+import Distribution.Extra.Doctest ( defaultMainWithDoctests )
+
+main :: IO ()
+main = defaultMainWithDoctests "doctests"
diff --git a/test/DocTest.hs b/test/DocTest.hs
deleted file mode 100644
--- a/test/DocTest.hs
+++ /dev/null
@@ -1,56 +0,0 @@
-module Main (main) where
-
-import RIO
-
-import System.FilePath.Glob (glob)
-import Test.DocTest (doctest)
-
-main :: IO ()
-main = glob "src/**/*.hs" >>= doDocTest
-
-doDocTest :: [String] -> IO ()
-doDocTest options =
-  doctest $
-    options <>
-    ghcExtensions
-
-ghcExtensions :: [String]
-ghcExtensions =
-    [ "-XBangPatterns"
-    , "-XBinaryLiterals"
-    , "-XConstraintKinds"
-    , "-XDataKinds"
-    , "-XDefaultSignatures"
-    , "-XDeriveDataTypeable"
-    , "-XDeriveFoldable"
-    , "-XDeriveFunctor"
-    , "-XDeriveGeneric"
-    , "-XDeriveTraversable"
-    , "-XDoAndIfThenElse"
-    , "-XEmptyDataDecls"
-    , "-XExistentialQuantification"
-    , "-XFlexibleContexts"
-    , "-XFlexibleInstances"
-    , "-XFunctionalDependencies"
-    , "-XGADTs"
-    , "-XGeneralizedNewtypeDeriving"
-    , "-XInstanceSigs"
-    , "-XKindSignatures"
-    , "-XLambdaCase"
-    , "-XMultiParamTypeClasses"
-    , "-XMultiWayIf"
-    , "-XNamedFieldPuns"
-    , "-XNoImplicitPrelude"
-    , "-XOverloadedStrings"
-    , "-XPartialTypeSignatures"
-    , "-XPatternGuards"
-    , "-XPolyKinds"
-    , "-XRankNTypes"
-    , "-XRecordWildCards"
-    , "-XScopedTypeVariables"
-    , "-XStandaloneDeriving"
-    , "-XTupleSections"
-    , "-XTypeFamilies"
-    , "-XTypeSynonymInstances"
-    , "-XViewPatterns"
-    ]
diff --git a/test/doctests.hs b/test/doctests.hs
new file mode 100644
--- /dev/null
+++ b/test/doctests.hs
@@ -0,0 +1,9 @@
+module Main where
+
+import RIO
+import Build_doctests (flags, pkgs, module_sources)
+import Test.DocTest
+
+main :: IO ()
+main = do
+  doctest $ flags ++ pkgs ++ module_sources
diff --git a/tonaparser.cabal b/tonaparser.cabal
--- a/tonaparser.cabal
+++ b/tonaparser.cabal
@@ -1,13 +1,11 @@
-cabal-version: 1.12
+cabal-version: 1.24
 
--- This file has been generated from package.yaml by hpack version 0.33.0.
+-- This file has been generated from package.yaml by hpack version 0.35.1.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: b60de14901080b258b151fca27f254cf725c5a3fb6f07cb84374e88c4a432882
 
 name:           tonaparser
-version:        0.1.0.1
+version:        0.2.0.0
 synopsis:       Scalable way to pass runtime configurations for tonatona
 description:    Tonaparser provides a way to pass runtime configurations. This library is supposed to be used with @tonatona@.
 category:       Library, System, Tonatona
@@ -18,7 +16,9 @@
 copyright:      2018 Kadzuya Okamoto
 license:        MIT
 license-file:   LICENSE
-build-type:     Simple
+build-type:     Custom
+tested-with:
+    GHC==9.4.6, GHC==9.2.8, GHC==9.0.2, GHC==8.10.7
 extra-source-files:
     README.md
 
@@ -26,6 +26,13 @@
   type: git
   location: https://github.com/tonatona-project/tonatona
 
+custom-setup
+  setup-depends:
+      Cabal <3.12
+    , base >=4.14 && <4.18
+    , cabal-doctest >=1 && <1.1
+    , rio ==0.1.*
+
 flag buildexample
   description: Build a small example program
   manual: False
@@ -38,13 +45,50 @@
       Paths_tonaparser
   hs-source-dirs:
       src
-  default-extensions: BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TupleSections TypeFamilies TypeSynonymInstances ViewPatterns
+  default-extensions:
+      BangPatterns
+      BinaryLiterals
+      ConstraintKinds
+      DataKinds
+      DefaultSignatures
+      DeriveDataTypeable
+      DeriveFoldable
+      DeriveFunctor
+      DeriveGeneric
+      DeriveTraversable
+      DoAndIfThenElse
+      EmptyDataDecls
+      ExistentialQuantification
+      FlexibleContexts
+      FlexibleInstances
+      FunctionalDependencies
+      GADTs
+      GeneralizedNewtypeDeriving
+      InstanceSigs
+      KindSignatures
+      LambdaCase
+      MultiParamTypeClasses
+      MultiWayIf
+      NamedFieldPuns
+      NoImplicitPrelude
+      OverloadedStrings
+      PartialTypeSignatures
+      PatternGuards
+      PolyKinds
+      RankNTypes
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      TupleSections
+      TypeFamilies
+      TypeSynonymInstances
+      ViewPatterns
   ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      base >=4.7 && <4.15
-    , envy >=1.5 && <2.2
-    , rio >=0.1 && <0.2
-    , say >=0.1 && <0.2
+      base >=4.14 && <4.18
+    , envy ==2.1.*
+    , rio ==0.1.*
+    , say ==0.1.*
   default-language: Haskell2010
 
 executable tonaparser-example
@@ -53,34 +97,107 @@
       Paths_tonaparser
   hs-source-dirs:
       example
-  default-extensions: BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TupleSections TypeFamilies TypeSynonymInstances ViewPatterns
+  default-extensions:
+      BangPatterns
+      BinaryLiterals
+      ConstraintKinds
+      DataKinds
+      DefaultSignatures
+      DeriveDataTypeable
+      DeriveFoldable
+      DeriveFunctor
+      DeriveGeneric
+      DeriveTraversable
+      DoAndIfThenElse
+      EmptyDataDecls
+      ExistentialQuantification
+      FlexibleContexts
+      FlexibleInstances
+      FunctionalDependencies
+      GADTs
+      GeneralizedNewtypeDeriving
+      InstanceSigs
+      KindSignatures
+      LambdaCase
+      MultiParamTypeClasses
+      MultiWayIf
+      NamedFieldPuns
+      NoImplicitPrelude
+      OverloadedStrings
+      PartialTypeSignatures
+      PatternGuards
+      PolyKinds
+      RankNTypes
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      TupleSections
+      TypeFamilies
+      TypeSynonymInstances
+      ViewPatterns
   ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      base >=4.7 && <4.15
-    , envy >=1.5 && <2.2
-    , rio >=0.1 && <0.2
+      base >=4.14 && <4.18
+    , envy ==2.1.*
+    , rio ==0.1.*
     , say
     , tonaparser
+  default-language: Haskell2010
   if flag(buildexample)
     buildable: True
   else
     buildable: False
-  default-language: Haskell2010
 
-test-suite doctest
+test-suite doctests
   type: exitcode-stdio-1.0
-  main-is: DocTest.hs
+  main-is: doctests.hs
   hs-source-dirs:
       test
-  default-extensions: BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TupleSections TypeFamilies TypeSynonymInstances ViewPatterns
+  default-extensions:
+      BangPatterns
+      BinaryLiterals
+      ConstraintKinds
+      DataKinds
+      DefaultSignatures
+      DeriveDataTypeable
+      DeriveFoldable
+      DeriveFunctor
+      DeriveGeneric
+      DeriveTraversable
+      DoAndIfThenElse
+      EmptyDataDecls
+      ExistentialQuantification
+      FlexibleContexts
+      FlexibleInstances
+      FunctionalDependencies
+      GADTs
+      GeneralizedNewtypeDeriving
+      InstanceSigs
+      KindSignatures
+      LambdaCase
+      MultiParamTypeClasses
+      MultiWayIf
+      NamedFieldPuns
+      NoImplicitPrelude
+      OverloadedStrings
+      PartialTypeSignatures
+      PatternGuards
+      PolyKinds
+      RankNTypes
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      TupleSections
+      TypeFamilies
+      TypeSynonymInstances
+      ViewPatterns
   ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      Glob
-    , base >=4.7 && <4.15
+      base >=4.14 && <4.18
     , doctest
-    , envy >=1.5 && <2.2
-    , rio >=0.1 && <0.2
-    , say >=0.1 && <0.2
+    , envy ==2.1.*
+    , rio ==0.1.*
+    , say ==0.1.*
   default-language: Haskell2010
 
 test-suite spec
@@ -88,12 +205,49 @@
   main-is: Spec.hs
   hs-source-dirs:
       test
-  default-extensions: BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TupleSections TypeFamilies TypeSynonymInstances ViewPatterns
+  default-extensions:
+      BangPatterns
+      BinaryLiterals
+      ConstraintKinds
+      DataKinds
+      DefaultSignatures
+      DeriveDataTypeable
+      DeriveFoldable
+      DeriveFunctor
+      DeriveGeneric
+      DeriveTraversable
+      DoAndIfThenElse
+      EmptyDataDecls
+      ExistentialQuantification
+      FlexibleContexts
+      FlexibleInstances
+      FunctionalDependencies
+      GADTs
+      GeneralizedNewtypeDeriving
+      InstanceSigs
+      KindSignatures
+      LambdaCase
+      MultiParamTypeClasses
+      MultiWayIf
+      NamedFieldPuns
+      NoImplicitPrelude
+      OverloadedStrings
+      PartialTypeSignatures
+      PatternGuards
+      PolyKinds
+      RankNTypes
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      TupleSections
+      TypeFamilies
+      TypeSynonymInstances
+      ViewPatterns
   ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      base >=4.7 && <4.15
-    , envy >=1.5 && <2.2
-    , rio >=0.1 && <0.2
-    , say >=0.1 && <0.2
-    , tonatona
+      base >=4.14 && <4.18
+    , envy ==2.1.*
+    , rio ==0.1.*
+    , say ==0.1.*
+    , tonaparser
   default-language: Haskell2010
