diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+# 1.5
+
+* Exclude Data.Semigroup.Option
+* Restrict to min GHC 8.4
+* Add focused preludes for data types and operators
+
+# 1.4
+
+* Restrict to min GHC 8.0 and give preference to MonadFail
+* Add IsList, Generic1 and export all of System.IO
+
 # 1.3
 
 * Give preference to Semigroup definitions over Monoid
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/base-prelude.cabal b/base-prelude.cabal
--- a/base-prelude.cabal
+++ b/base-prelude.cabal
@@ -1,9 +1,8 @@
-name:
-  base-prelude
-version:
-  1.4
-synopsis:
-  The most complete prelude formed solely from the "base" package
+cabal-version: 3.0
+
+name: base-prelude
+version: 1.5
+synopsis: The most complete prelude formed solely from the "base" package
 description:
   A library which aims to reexport all the non-conflicting and
   most general definitions from the \"base\" package.
@@ -18,44 +17,27 @@
   that its exports in part are transitively determined by the version of \"base\".
   Therefore it's recommended for the users of \"base-prelude\" to specify
   the bounds of \"base\" as well.
-category:
-  Prelude
-homepage:
-  https://github.com/nikita-volkov/base-prelude 
-bug-reports:
-  https://github.com/nikita-volkov/base-prelude/issues 
-author:
-  Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:
-  Nikita Volkov <nikita.y.volkov@mail.ru>
-copyright:
-  (c) 2014, Nikita Volkov
-license:
-  MIT
-license-file:
-  LICENSE
-build-type:
-  Simple
-extra-source-files:
-  CHANGELOG.md
-cabal-version:
-  >=1.10
-
+category: Prelude
+homepage: https://github.com/nikita-volkov/base-prelude
+bug-reports: https://github.com/nikita-volkov/base-prelude/issues
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
+copyright: (c) 2014, Nikita Volkov
+license: MIT
+license-file: LICENSE
+build-type: Simple
+extra-source-files: CHANGELOG.md
 
 source-repository head
-  type:
-    git
-  location:
-    git://github.com/nikita-volkov/base-prelude.git
-
+  type: git
+  location: git://github.com/nikita-volkov/base-prelude.git
 
 library
-  hs-source-dirs:
-    library
-  other-modules:
+  hs-source-dirs: library
+  default-language: Haskell2010
   exposed-modules:
     BasePrelude
+    BasePrelude.DataTypes
+    BasePrelude.Operators
   build-depends:
-    base >= 4.9 && < 5
-  default-language:
-    Haskell2010
+    base >=4.11 && <5
diff --git a/library/BasePrelude.hs b/library/BasePrelude.hs
--- a/library/BasePrelude.hs
+++ b/library/BasePrelude.hs
@@ -1,23 +1,19 @@
 -- |
--- This module reexports most of the definitions from the \"base\" package,
--- which are meant to be imported unqualified.
+-- Reexports of most of the definitions from the \"base\" package,
+-- which it is a common practice to import unqualified.
 --
 -- For details check out the source.
 module BasePrelude
-(
-  module Exports,
-)
+  ( module Exports,
+  )
 where
 
--- Reexports
--------------------------
-
 import Control.Applicative as Exports
 import Control.Arrow as Exports hiding (first, second)
 import Control.Category as Exports
 import Control.Concurrent as Exports
 import Control.Exception as Exports
-import Control.Monad as Exports hiding (mapM_, sequence_, forM_, msum, mapM, sequence, forM, fail)
+import Control.Monad as Exports hiding (fail, forM, forM_, mapM, mapM_, msum, sequence, sequence_)
 import Control.Monad.Fail as Exports
 import Control.Monad.Fix as Exports hiding (fix)
 import Control.Monad.IO.Class as Exports
@@ -33,23 +29,23 @@
 import Data.Either as Exports
 import Data.Fixed as Exports
 import Data.Foldable as Exports hiding (toList)
-import Data.Function as Exports hiding ((.), id)
+import Data.Function as Exports hiding (id, (.))
 import Data.Functor as Exports
 import Data.Functor.Classes as Exports
 import Data.Functor.Compose as Exports
 import Data.Functor.Identity as Exports
-import Data.Int as Exports
 import Data.IORef as Exports
+import Data.Int as Exports
 import Data.Ix as Exports
 import Data.List as Exports hiding (all, and, any, concat, concatMap, elem, find, foldl, foldl', foldl1, foldr, foldr1, mapAccumL, mapAccumR, maximum, maximumBy, minimum, minimumBy, notElem, or, product, sum)
-import Data.List.NonEmpty as Exports (NonEmpty(..))
+import Data.List.NonEmpty as Exports (NonEmpty (..))
 import Data.Maybe as Exports
-import Data.Monoid as Exports hiding ((<>), First(..), Last(..))
+import Data.Monoid as Exports hiding (First (..), Last (..), (<>))
 import Data.Ord as Exports
 import Data.Proxy as Exports
 import Data.Ratio as Exports
-import Data.Semigroup as Exports
 import Data.STRef as Exports
+import Data.Semigroup as Exports hiding (Option)
 import Data.String as Exports
 import Data.Traversable as Exports
 import Data.Tuple as Exports
@@ -62,13 +58,12 @@
 import Foreign.Ptr as Exports
 import Foreign.StablePtr as Exports
 import Foreign.Storable as Exports
-import GHC.Conc as Exports hiding (withMVar, threadWaitWriteSTM, threadWaitWrite, threadWaitReadSTM, threadWaitRead)
-import GHC.Exts as Exports (lazy, inline, sortWith, groupWith, IsList(..))
+import GHC.Conc as Exports hiding (threadWaitRead, threadWaitReadSTM, threadWaitWrite, threadWaitWriteSTM, withMVar)
+import GHC.Exts as Exports (IsList (..), groupWith, inline, lazy, sortWith)
 import GHC.Generics as Exports (Generic, Generic1)
 import GHC.IO.Exception as Exports
 import Numeric as Exports
 import Numeric.Natural as Exports
-import Prelude as Exports hiding (concat, foldr, mapM_, sequence_, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, mapM, sequence, id, (.), fail)
 import System.Environment as Exports
 import System.Exit as Exports
 import System.IO as Exports
@@ -78,7 +73,8 @@
 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, readPrec_to_P, readP_to_Prec, readPrec_to_S, readS_to_Prec)
-import Text.Printf as Exports (printf, hPrintf)
-import Text.Read as Exports (Read(..), readMaybe, readEither)
+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, (.))
diff --git a/library/BasePrelude/DataTypes.hs b/library/BasePrelude/DataTypes.hs
new file mode 100644
--- /dev/null
+++ b/library/BasePrelude/DataTypes.hs
@@ -0,0 +1,51 @@
+-- |
+-- A module that reexports only the data types
+-- defined across various modules of the \"base\" package.
+--
+-- By data types we mean that it is the ones we use
+-- to define data structures.
+-- It is not abstraction integration wrappers,
+-- like 'Data.Semigroup.First'.
+-- It is not resource types like 'System.IO.Handle'.
+module BasePrelude.DataTypes
+  ( -- * From "Prelude"
+    Prelude.Bool (..),
+    Prelude.Char,
+    Prelude.Double,
+    Prelude.Either (..),
+    Prelude.Float,
+    Prelude.Integer,
+    Prelude.Maybe (..),
+    Prelude.String,
+
+    -- * From "Data.Int"
+    Data.Int.Int,
+    Data.Int.Int16,
+    Data.Int.Int32,
+    Data.Int.Int64,
+    Data.Int.Int8,
+
+    -- * From "Data.Word"
+    Data.Word.Word,
+    Data.Word.Word16,
+    Data.Word.Word32,
+    Data.Word.Word64,
+    Data.Word.Word8,
+
+    -- * From "Data.Ratio"
+    Data.Ratio.Rational,
+
+    -- * From "Numeric.Natural"
+    Numeric.Natural.Natural,
+
+    -- * From "Data.List.NonEmpty"
+    Data.List.NonEmpty.NonEmpty (..),
+  )
+where
+
+import qualified Data.Int
+import qualified Data.List.NonEmpty
+import qualified Data.Ratio
+import qualified Data.Word
+import qualified Numeric.Natural
+import qualified Prelude
diff --git a/library/BasePrelude/Operators.hs b/library/BasePrelude/Operators.hs
new file mode 100644
--- /dev/null
+++ b/library/BasePrelude/Operators.hs
@@ -0,0 +1,72 @@
+-- |
+-- A collection of common operators provided across
+-- various modules of the \"base\" package.
+module BasePrelude.Operators
+  ( -- * From "Control.Applicative"
+    (Control.Applicative.*>),
+    (Control.Applicative.<*),
+    (Control.Applicative.<*>),
+    (Control.Applicative.<|>),
+
+    -- * From "Control.Monad"
+    (Control.Monad.<=<),
+    (Control.Monad.=<<),
+    (Control.Monad.>=>),
+    (Control.Monad.>>),
+    (Control.Monad.>>=),
+
+    -- * From "Data.Bits"
+    (Data.Bits..&.),
+    (Data.Bits..|.),
+
+    -- * From "Data.Bool"
+    (Data.Bool.&&),
+    (Data.Bool.||),
+    (Data.Eq./=),
+    (Data.Eq.==),
+
+    -- * From "Data.Function"
+    (Data.Function.$),
+    (Data.Function.&),
+    (Data.Function..),
+
+    -- * From "Data.Functor"
+    (Data.Functor.$>),
+    (Data.Functor.<$),
+    (Data.Functor.<$>),
+    (Data.Functor.<&>),
+
+    -- * From "Data.Ord"
+    (Data.Ord.<),
+    (Data.Ord.<=),
+    (Data.Ord.>),
+    (Data.Ord.>=),
+
+    -- * From "Data.Ratio"
+    (Data.Ratio.%),
+
+    -- * From "Data.Semigroup"
+    (Data.Semigroup.<>),
+
+    -- * From "Prelude"
+    (Prelude.$!),
+    (Prelude.*),
+    (Prelude.+),
+    (Prelude.-),
+    (Prelude./),
+    (Prelude.^),
+    (Prelude.^^),
+  )
+where
+
+import qualified Control.Applicative
+import qualified Control.Monad
+import qualified Data.Bits
+import qualified Data.Bool
+import qualified Data.Eq
+import qualified Data.Function
+import qualified Data.Functor
+import qualified Data.Ord
+import qualified Data.Ratio
+import qualified Data.Semigroup
+import qualified Prelude
