diff --git a/changelog.md b/changelog.md
deleted file mode 100644
--- a/changelog.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Unreleased
-
-* Add interceptors for setting the log level.
-* Set std streams to line buffering.
-
-# 0.3.0.0
-
-* Add concurrent interpreters for stdout and stderr.
-* Add stdout interpreters.
-
-# 0.2.1.0
-
-* Add naive stderr interpreters for `DataLog` and `Log`.
-
-# 0.2.0.0
-
-* `DataLog` got a second constructor, `Local`. It takes a higher-order `Sem` and a transformation function, the latter
-  of which is applied to all messages logged within the former.
-  This allows context manipulation for blocks of code.
-* `interceptDataLogConc` adds support for concurrent processing of log messages to any interpretation of `DataLog`.
diff --git a/lib/Polysemy/Log.hs b/lib/Polysemy/Log.hs
--- a/lib/Polysemy/Log.hs
+++ b/lib/Polysemy/Log.hs
@@ -1,7 +1,7 @@
 {-# language NoImplicitPrelude #-}
 {-# options_haddock prune #-}
--- |Description: Polysemy Effects for Logging
 
+-- |Description: Polysemy Effects for Logging
 module Polysemy.Log (
   -- * Introduction
   -- $intro
@@ -19,6 +19,7 @@
   interpretDataLogStdout,
   interpretDataLogAtomic',
   interpretDataLogAtomic,
+  interpretDataLog,
 
   -- * Text Messages with Severity and Metadata
   -- $messages
@@ -34,6 +35,7 @@
   crit,
   formatLogEntry,
   Severity(..),
+  parseSeverity,
   setLogLevel,
   setLogLevelWith,
 
@@ -66,14 +68,15 @@
 
 import Polysemy.Log.Atomic (interpretDataLogAtomic, interpretDataLogAtomic', interpretLogAtomic, interpretLogAtomic')
 import Polysemy.Log.Conc (interceptDataLogConc)
-import Polysemy.Log.Data.DataLog (DataLog (DataLog), Logger, dataLog)
-import Polysemy.Log.Data.Log (Log (Log), crit, debug, error, info, log, trace, warn)
+import Polysemy.Log.Effect.DataLog (DataLog (DataLog), Logger, dataLog)
+import Polysemy.Log.Effect.Log (Log (Log), crit, debug, error, info, log, trace, warn)
 import Polysemy.Log.Data.LogEntry (LogEntry (LogEntry))
 import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
-import Polysemy.Log.Data.Severity (Severity (..))
+import Polysemy.Log.Data.Severity (Severity (..), parseSeverity)
 import Polysemy.Log.Format (formatLogEntry)
 import Polysemy.Log.Level (setLogLevel, setLogLevelWith)
 import Polysemy.Log.Log (
+  interpretDataLog,
   interpretLogDataLog,
   interpretLogDataLog',
   interpretLogDataLogConc,
diff --git a/lib/Polysemy/Log/Atomic.hs b/lib/Polysemy/Log/Atomic.hs
--- a/lib/Polysemy/Log/Atomic.hs
+++ b/lib/Polysemy/Log/Atomic.hs
@@ -3,8 +3,8 @@
 
 import Control.Concurrent.STM (newTVarIO)
 
-import Polysemy.Log.Data.DataLog (DataLog)
-import Polysemy.Log.Data.Log (Log (Log))
+import Polysemy.Log.Effect.DataLog (DataLog)
+import Polysemy.Log.Effect.Log (Log (Log))
 import Polysemy.Log.Data.LogMessage (LogMessage)
 import Polysemy.Log.Log (interpretDataLog)
 
diff --git a/lib/Polysemy/Log/Conc.hs b/lib/Polysemy/Log/Conc.hs
--- a/lib/Polysemy/Log/Conc.hs
+++ b/lib/Polysemy/Log/Conc.hs
@@ -9,8 +9,8 @@
 import Polysemy.Internal.Tactics (liftT)
 import Polysemy.Time (Seconds (Seconds))
 
-import qualified Polysemy.Log.Data.DataLog as DataLog
-import Polysemy.Log.Data.DataLog (DataLog (DataLog, Local))
+import qualified Polysemy.Log.Effect.DataLog as DataLog
+import Polysemy.Log.Effect.DataLog (DataLog (DataLog, Local))
 
 -- |Intercept 'DataLog' for concurrent processing.
 -- This does not send any action to the ultimate interpreter but writes all log messages to the provided queue.
diff --git a/lib/Polysemy/Log/Data/DataLog.hs b/lib/Polysemy/Log/Data/DataLog.hs
deleted file mode 100644
--- a/lib/Polysemy/Log/Data/DataLog.hs
+++ /dev/null
@@ -1,100 +0,0 @@
-{-# options_haddock prune #-}
-
--- |Description: Internal
-module Polysemy.Log.Data.DataLog where
-
-import GHC.Stack (withFrozenCallStack)
-import Polysemy.Time (GhcTime)
-
-import Polysemy.Log.Data.LogEntry (LogEntry, annotate)
-import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
-import Polysemy.Log.Data.Severity (Severity (Crit, Debug, Error, Info, Trace, Warn))
-
--- |Structural logs, used as a backend for the simpler 'Text' log effect, 'Polysemy.Log.Log'.
---
--- Can also be used on its own, or reinterpreted into an effect like those from /co-log/ or /di/.
-data DataLog a :: Effect where
-  -- |Schedule an arbitrary value for logging.
-  DataLog :: a -> DataLog a m ()
-  -- |Stores the provided function in the interpreter and applies it to all log messages emitted within the higher-order
-  -- thunk that's the second argument.
-  Local :: (a -> a) -> m b -> DataLog a m b
-
-makeSem ''DataLog
-
--- |Alias for the logger with the default message type used by 'Polysemy.Log.Log'.
-type Logger =
-  DataLog (LogEntry LogMessage)
-
--- |Log a text message with the given severity.
--- Basic 'Sem' constructor.
-log ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Severity ->
-  Text ->
-  Sem r ()
-log severity message =
-  withFrozenCallStack do
-    send . DataLog =<< annotate (LogMessage severity message)
-{-# inline log #-}
-
--- |Log a text message with the 'Trace' severity.
-trace ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Text ->
-  Sem r ()
-trace =
-  withFrozenCallStack (log Trace)
-{-# inline trace #-}
-
--- |Log a text message with the 'Debug' severity.
-debug ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Text ->
-  Sem r ()
-debug =
-  withFrozenCallStack (log Debug)
-{-# inline debug #-}
-
--- |Log a text message with the 'Info' severity.
-info ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Text ->
-  Sem r ()
-info =
-  withFrozenCallStack (log Info)
-{-# inline info #-}
-
--- |Log a text message with the 'Warn' severity.
-warn ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Text ->
-  Sem r ()
-warn =
-  withFrozenCallStack (log Warn)
-{-# inline warn #-}
-
--- |Log a text message with the 'Polysemy.Log.Data.Severity.Error' severity.
-error ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Text ->
-  Sem r ()
-error =
-  withFrozenCallStack (log Error)
-{-# inline error #-}
-
--- |Log a text message with the 'Crit' severity.
-crit ::
-  HasCallStack =>
-  Members [Logger, GhcTime] r =>
-  Text ->
-  Sem r ()
-crit =
-  withFrozenCallStack (log Crit)
-{-# inline crit #-}
diff --git a/lib/Polysemy/Log/Data/Log.hs b/lib/Polysemy/Log/Data/Log.hs
deleted file mode 100644
--- a/lib/Polysemy/Log/Data/Log.hs
+++ /dev/null
@@ -1,102 +0,0 @@
--- |Description: Internal
-module Polysemy.Log.Data.Log where
-
-import GHC.Stack (withFrozenCallStack)
-
-import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
-import Polysemy.Log.Data.Severity (Severity (Crit, Debug, Error, Info, Trace, Warn))
-
--- |The default high-level effect for simple text messages.
--- To be used with the severity constructors:
---
--- @
--- import qualified Polysemy.Log as Log
---
--- prog = do
---   Log.debug "debugging…"
---   Log.warn "warning!"
--- @
---
--- Interpreters should preprocess and relay the message to 'Polysemy.Log.DataLog'.
-data Log :: Effect where
-  -- |Schedule a message to be logged.
-  Log :: HasCallStack => LogMessage -> Log m ()
-
--- |Log a message with the given severity.
--- Basic 'Sem' constructor.
-log ::
-  HasCallStack =>
-  Member Log r =>
-  Severity ->
-  Text ->
-  Sem r ()
-log severity message =
-  withFrozenCallStack $
-  send (Log (LogMessage severity message))
-{-# inline log #-}
-
--- |Log a message with the 'Trace' severity.
-trace ::
-  HasCallStack =>
-  Member Log r =>
-  Text ->
-  Sem r ()
-trace =
-  withFrozenCallStack $
-  log Trace
-{-# inline trace #-}
-
--- |Log a message with the 'Debug' severity.
-debug ::
-  HasCallStack =>
-  Member Log r =>
-  Text ->
-  Sem r ()
-debug =
-  withFrozenCallStack $
-  log Debug
-{-# inline debug #-}
-
--- |Log a message with the 'Info' severity.
-info ::
-  HasCallStack =>
-  Member Log r =>
-  Text ->
-  Sem r ()
-info =
-  withFrozenCallStack $
-  log Info
-{-# inline info #-}
-
--- |Log a message with the 'Warn' severity.
-warn ::
-  HasCallStack =>
-  Member Log r =>
-  Text ->
-  Sem r ()
-warn =
-  withFrozenCallStack $
-  log Warn
-{-# inline warn #-}
-
--- |Log a message with the 'Polysemy.Log.Data.Severity.Error' severity.
-error ::
-  HasCallStack =>
-  Member Log r =>
-  Text ->
-  Sem r ()
-error =
-  withFrozenCallStack $
-  log Error
-{-# inline error #-}
-
--- |Log a message with the 'Crit' severity.
-crit ::
-  HasCallStack =>
-  Member Log r =>
-  Text ->
-  Sem r ()
-crit =
-  withFrozenCallStack $
-  log Crit
-{-# inline crit #-}
diff --git a/lib/Polysemy/Log/Data/LogEntry.hs b/lib/Polysemy/Log/Data/LogEntry.hs
--- a/lib/Polysemy/Log/Data/LogEntry.hs
+++ b/lib/Polysemy/Log/Data/LogEntry.hs
@@ -16,7 +16,7 @@
     -- |The call stack of the function in which the entry was created.
     source :: !CallStack
   }
-  deriving (Show)
+  deriving stock (Show)
 
 -- |Add call stack and timestamp to a message and wrap it with 'LogEntry'.
 annotate ::
diff --git a/lib/Polysemy/Log/Data/LogMessage.hs b/lib/Polysemy/Log/Data/LogMessage.hs
--- a/lib/Polysemy/Log/Data/LogMessage.hs
+++ b/lib/Polysemy/Log/Data/LogMessage.hs
@@ -10,4 +10,4 @@
     severity :: !Severity,
     message :: !Text
   }
-  deriving (Eq, Show)
+  deriving stock (Eq, Show)
diff --git a/lib/Polysemy/Log/Data/LogMetadata.hs b/lib/Polysemy/Log/Data/LogMetadata.hs
deleted file mode 100644
--- a/lib/Polysemy/Log/Data/LogMetadata.hs
+++ /dev/null
@@ -1,20 +0,0 @@
--- |Description: Internal
-module Polysemy.Log.Data.LogMetadata where
-
--- |Internal effect used as an intermediate stage between 'Polysemy.Log.Log' and 'Polysemy.Log.DataLog', for the purpose
--- of isolating the metadata annotation task.
---
--- The type of metadata is arbitrary and chosen in interpreters, but this exposes a 'HasCallStack' dependency since it's
--- the primary purpose.
-data LogMetadata msg :: Effect where
-  -- |Schedule a message to be annotated and logged.
-  Annotated :: HasCallStack => msg -> LogMetadata msg m ()
-
--- |Schedule a message to be annotated and logged.
-annotated ::
-  HasCallStack =>
-  Member (LogMetadata msg) r =>
-  msg ->
-  Sem r ()
-annotated msg =
-  send (Annotated msg)
diff --git a/lib/Polysemy/Log/Data/Severity.hs b/lib/Polysemy/Log/Data/Severity.hs
--- a/lib/Polysemy/Log/Data/Severity.hs
+++ b/lib/Polysemy/Log/Data/Severity.hs
@@ -1,6 +1,8 @@
 -- |Description: Internal
 module Polysemy.Log.Data.Severity where
 
+import qualified Data.Text as Text
+
 -- |A log message's severity, or log level.
 data Severity =
   Trace
@@ -14,4 +16,16 @@
   Error
   |
   Crit
-  deriving (Eq, Show, Enum, Ord)
+  deriving stock (Eq, Show, Enum, Ord)
+
+-- |Parse a 'Text' into a 'Severity'.
+parseSeverity :: Text -> Maybe Severity
+parseSeverity =
+  Text.toLower >>> \case
+    "trace" -> Just Trace
+    "debug" -> Just Debug
+    "info" -> Just Info
+    "warn" -> Just Warn
+    "error" -> Just Error
+    "crit" -> Just Crit
+    _ -> Nothing
diff --git a/lib/Polysemy/Log/Effect/DataLog.hs b/lib/Polysemy/Log/Effect/DataLog.hs
new file mode 100644
--- /dev/null
+++ b/lib/Polysemy/Log/Effect/DataLog.hs
@@ -0,0 +1,99 @@
+{-# options_haddock prune #-}
+
+-- |Description: Internal
+module Polysemy.Log.Effect.DataLog where
+
+import Polysemy.Time (GhcTime)
+
+import Polysemy.Log.Data.LogEntry (LogEntry, annotate)
+import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
+import Polysemy.Log.Data.Severity (Severity (Crit, Debug, Error, Info, Trace, Warn))
+
+-- |Structural logs, used as a backend for the simpler 'Text' log effect, 'Polysemy.Log.Log'.
+--
+-- Can also be used on its own, or reinterpreted into an effect like those from /co-log/ or /di/.
+data DataLog a :: Effect where
+  -- |Schedule an arbitrary value for logging.
+  DataLog :: a -> DataLog a m ()
+  -- |Stores the provided function in the interpreter and applies it to all log messages emitted within the higher-order
+  -- thunk that's the second argument.
+  Local :: (a -> a) -> m b -> DataLog a m b
+
+makeSem ''DataLog
+
+-- |Alias for the logger with the default message type used by 'Polysemy.Log.Log'.
+type Logger =
+  DataLog (LogEntry LogMessage)
+
+-- |Log a text message with the given severity.
+-- Basic 'Sem' constructor.
+log ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Severity ->
+  Text ->
+  Sem r ()
+log severity message =
+  withFrozenCallStack do
+    send . DataLog =<< annotate (LogMessage severity message)
+{-# inline log #-}
+
+-- |Log a text message with the 'Trace' severity.
+trace ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Text ->
+  Sem r ()
+trace =
+  withFrozenCallStack (log Trace)
+{-# inline trace #-}
+
+-- |Log a text message with the 'Debug' severity.
+debug ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Text ->
+  Sem r ()
+debug =
+  withFrozenCallStack (log Debug)
+{-# inline debug #-}
+
+-- |Log a text message with the 'Info' severity.
+info ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Text ->
+  Sem r ()
+info =
+  withFrozenCallStack (log Info)
+{-# inline info #-}
+
+-- |Log a text message with the 'Warn' severity.
+warn ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Text ->
+  Sem r ()
+warn =
+  withFrozenCallStack (log Warn)
+{-# inline warn #-}
+
+-- |Log a text message with the 'Polysemy.Log.Data.Severity.Error' severity.
+error ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Text ->
+  Sem r ()
+error =
+  withFrozenCallStack (log Error)
+{-# inline error #-}
+
+-- |Log a text message with the 'Crit' severity.
+crit ::
+  HasCallStack =>
+  Members [Logger, GhcTime] r =>
+  Text ->
+  Sem r ()
+crit =
+  withFrozenCallStack (log Crit)
+{-# inline crit #-}
diff --git a/lib/Polysemy/Log/Effect/Log.hs b/lib/Polysemy/Log/Effect/Log.hs
new file mode 100644
--- /dev/null
+++ b/lib/Polysemy/Log/Effect/Log.hs
@@ -0,0 +1,100 @@
+-- |Description: Internal
+module Polysemy.Log.Effect.Log where
+
+import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
+import Polysemy.Log.Data.Severity (Severity (Crit, Debug, Error, Info, Trace, Warn))
+
+-- |The default high-level effect for simple text messages.
+-- To be used with the severity constructors:
+--
+-- @
+-- import qualified Polysemy.Log as Log
+--
+-- prog = do
+--   Log.debug "debugging…"
+--   Log.warn "warning!"
+-- @
+--
+-- Interpreters should preprocess and relay the message to 'Polysemy.Log.DataLog'.
+data Log :: Effect where
+  -- |Schedule a message to be logged.
+  Log :: HasCallStack => LogMessage -> Log m ()
+
+-- |Log a message with the given severity.
+-- Basic 'Sem' constructor.
+log ::
+  HasCallStack =>
+  Member Log r =>
+  Severity ->
+  Text ->
+  Sem r ()
+log severity message =
+  withFrozenCallStack $
+  send (Log (LogMessage severity message))
+{-# inline log #-}
+
+-- |Log a message with the 'Trace' severity.
+trace ::
+  HasCallStack =>
+  Member Log r =>
+  Text ->
+  Sem r ()
+trace =
+  withFrozenCallStack $
+  log Trace
+{-# inline trace #-}
+
+-- |Log a message with the 'Debug' severity.
+debug ::
+  HasCallStack =>
+  Member Log r =>
+  Text ->
+  Sem r ()
+debug =
+  withFrozenCallStack $
+  log Debug
+{-# inline debug #-}
+
+-- |Log a message with the 'Info' severity.
+info ::
+  HasCallStack =>
+  Member Log r =>
+  Text ->
+  Sem r ()
+info =
+  withFrozenCallStack $
+  log Info
+{-# inline info #-}
+
+-- |Log a message with the 'Warn' severity.
+warn ::
+  HasCallStack =>
+  Member Log r =>
+  Text ->
+  Sem r ()
+warn =
+  withFrozenCallStack $
+  log Warn
+{-# inline warn #-}
+
+-- |Log a message with the 'Polysemy.Log.Data.Severity.Error' severity.
+error ::
+  HasCallStack =>
+  Member Log r =>
+  Text ->
+  Sem r ()
+error =
+  withFrozenCallStack $
+  log Error
+{-# inline error #-}
+
+-- |Log a message with the 'Crit' severity.
+crit ::
+  HasCallStack =>
+  Member Log r =>
+  Text ->
+  Sem r ()
+crit =
+  withFrozenCallStack $
+  log Crit
+{-# inline crit #-}
diff --git a/lib/Polysemy/Log/Effect/LogMetadata.hs b/lib/Polysemy/Log/Effect/LogMetadata.hs
new file mode 100644
--- /dev/null
+++ b/lib/Polysemy/Log/Effect/LogMetadata.hs
@@ -0,0 +1,20 @@
+-- |Description: Internal
+module Polysemy.Log.Effect.LogMetadata where
+
+-- |Internal effect used as an intermediate stage between 'Polysemy.Log.Log' and 'Polysemy.Log.DataLog', for the purpose
+-- of isolating the metadata annotation task.
+--
+-- The type of metadata is arbitrary and chosen in interpreters, but this exposes a 'HasCallStack' dependency since it's
+-- the primary purpose.
+data LogMetadata msg :: Effect where
+  -- |Schedule a message to be annotated and logged.
+  Annotated :: HasCallStack => msg -> LogMetadata msg m ()
+
+-- |Schedule a message to be annotated and logged.
+annotated ::
+  HasCallStack =>
+  Member (LogMetadata msg) r =>
+  msg ->
+  Sem r ()
+annotated msg =
+  send (Annotated msg)
diff --git a/lib/Polysemy/Log/Handle.hs b/lib/Polysemy/Log/Handle.hs
--- a/lib/Polysemy/Log/Handle.hs
+++ b/lib/Polysemy/Log/Handle.hs
@@ -4,7 +4,7 @@
 import qualified Data.Text.IO as Text
 import System.IO (BufferMode (LineBuffering), Handle, hSetBuffering)
 
-import Polysemy.Log.Data.DataLog (DataLog)
+import Polysemy.Log.Effect.DataLog (DataLog)
 import Polysemy.Log.Log (interpretDataLog)
 
 -- |Interpret 'DataLog' by printing to the given handle, converting messages to 'Text' with the supplied function.
diff --git a/lib/Polysemy/Log/Level.hs b/lib/Polysemy/Log/Level.hs
--- a/lib/Polysemy/Log/Level.hs
+++ b/lib/Polysemy/Log/Level.hs
@@ -1,8 +1,8 @@
 -- |Description: Internal
 module Polysemy.Log.Level where
 
-import qualified Polysemy.Log.Data.DataLog as DataLog
-import Polysemy.Log.Data.DataLog (DataLog (DataLog, Local))
+import qualified Polysemy.Log.Effect.DataLog as DataLog
+import Polysemy.Log.Effect.DataLog (DataLog (DataLog, Local))
 import qualified Polysemy.Log.Data.LogEntry as LogEntry
 import Polysemy.Log.Data.LogEntry (LogEntry)
 import qualified Polysemy.Log.Data.LogMessage as LogMessage
diff --git a/lib/Polysemy/Log/Log.hs b/lib/Polysemy/Log/Log.hs
--- a/lib/Polysemy/Log/Log.hs
+++ b/lib/Polysemy/Log/Log.hs
@@ -6,11 +6,11 @@
 import Polysemy.Time (GhcTime, interpretTimeGhc)
 
 import Polysemy.Log.Conc (interceptDataLogConc)
-import Polysemy.Log.Data.DataLog (DataLog (DataLog, Local), dataLog)
-import Polysemy.Log.Data.Log (Log (Log))
+import Polysemy.Log.Effect.DataLog (DataLog (DataLog, Local), dataLog)
+import Polysemy.Log.Effect.Log (Log (Log))
 import Polysemy.Log.Data.LogEntry (LogEntry, annotate)
 import Polysemy.Log.Data.LogMessage (LogMessage)
-import Polysemy.Log.Data.LogMetadata (LogMetadata (Annotated), annotated)
+import Polysemy.Log.Effect.LogMetadata (LogMetadata (Annotated), annotated)
 
 -- |Interpret 'Log' into the intermediate internal effect 'LogMetadata'.
 interpretLogLogMetadata ::
diff --git a/lib/Polysemy/Log/Pure.hs b/lib/Polysemy/Log/Pure.hs
--- a/lib/Polysemy/Log/Pure.hs
+++ b/lib/Polysemy/Log/Pure.hs
@@ -1,7 +1,7 @@
 -- |Description: Pure interpreters for 'Log'.
 module Polysemy.Log.Pure where
 
-import Polysemy.Log.Data.Log (Log (Log))
+import Polysemy.Log.Effect.Log (Log (Log))
 import Polysemy.Log.Data.LogMessage (LogMessage)
 
 -- |Interpret 'Log' in terms of 'Output'.
diff --git a/lib/Polysemy/Log/Stderr.hs b/lib/Polysemy/Log/Stderr.hs
--- a/lib/Polysemy/Log/Stderr.hs
+++ b/lib/Polysemy/Log/Stderr.hs
@@ -5,8 +5,8 @@
 import Polysemy.Time (GhcTime, interpretTimeGhc)
 import System.IO (stderr)
 
-import Polysemy.Log.Data.DataLog (DataLog)
-import Polysemy.Log.Data.Log (Log)
+import Polysemy.Log.Effect.DataLog (DataLog)
+import Polysemy.Log.Effect.Log (Log)
 import Polysemy.Log.Data.LogEntry (LogEntry)
 import Polysemy.Log.Data.LogMessage (LogMessage)
 import Polysemy.Log.Data.Severity (Severity)
diff --git a/lib/Polysemy/Log/Stdout.hs b/lib/Polysemy/Log/Stdout.hs
--- a/lib/Polysemy/Log/Stdout.hs
+++ b/lib/Polysemy/Log/Stdout.hs
@@ -5,8 +5,8 @@
 import Polysemy.Time (GhcTime, interpretTimeGhc)
 import System.IO (stdout)
 
-import Polysemy.Log.Data.DataLog (DataLog)
-import Polysemy.Log.Data.Log (Log)
+import Polysemy.Log.Effect.DataLog (DataLog)
+import Polysemy.Log.Effect.Log (Log)
 import Polysemy.Log.Data.LogEntry (LogEntry)
 import Polysemy.Log.Data.LogMessage (LogMessage)
 import Polysemy.Log.Data.Severity (Severity)
diff --git a/polysemy-log.cabal b/polysemy-log.cabal
--- a/polysemy-log.cabal
+++ b/polysemy-log.cabal
@@ -5,21 +5,18 @@
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-log
-version:        0.6.0.1
-synopsis:       Polysemy Effects for Logging
-description:    See <https://hackage.haskell.org/package/polysemy-log/docs/Polysemy-Log.html>
+version:        0.7.0.0
+synopsis:       Polysemy effects for logging
+description:    See https://hackage.haskell.org/package/polysemy-log/docs/Polysemy-Log.html
 category:       Logging
 homepage:       https://github.com/tek/polysemy-log#readme
 bug-reports:    https://github.com/tek/polysemy-log/issues
 author:         Torsten Schmits
-maintainer:     tek@tryp.io
-copyright:      2021 Torsten Schmits
+maintainer:     hackage@tryp.io
+copyright:      2022 Torsten Schmits
 license:        BSD-2-Clause-Patent
 license-file:   LICENSE
 build-type:     Simple
-extra-source-files:
-    readme.md
-    changelog.md
 
 source-repository head
   type: git
@@ -30,12 +27,12 @@
       Polysemy.Log
       Polysemy.Log.Atomic
       Polysemy.Log.Conc
-      Polysemy.Log.Data.DataLog
-      Polysemy.Log.Data.Log
       Polysemy.Log.Data.LogEntry
       Polysemy.Log.Data.LogMessage
-      Polysemy.Log.Data.LogMetadata
       Polysemy.Log.Data.Severity
+      Polysemy.Log.Effect.DataLog
+      Polysemy.Log.Effect.Log
+      Polysemy.Log.Effect.LogMetadata
       Polysemy.Log.Format
       Polysemy.Log.Handle
       Polysemy.Log.Level
@@ -59,6 +56,7 @@
       DeriveFoldable
       DeriveFunctor
       DeriveGeneric
+      DeriveLift
       DeriveTraversable
       DerivingStrategies
       DerivingVia
@@ -91,6 +89,7 @@
       RankNTypes
       RecordWildCards
       RecursiveDo
+      RoleAnnotations
       ScopedTypeVariables
       StandaloneDeriving
       TemplateHaskell
@@ -103,19 +102,21 @@
       UndecidableInstances
       UnicodeSyntax
       ViewPatterns
-  ghc-options: -Wall -Wredundant-constraints -Wunused-packages -Widentities
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Widentities -Wunused-packages
   build-depends:
       ansi-terminal >=0.10.3
     , async
-    , base ==4.*
-    , incipit-core >=0.2
-    , polysemy >=1.5
-    , polysemy-conc >=0.7
-    , polysemy-time >=0.4
+    , base >=4.12 && <5
+    , incipit-core >=0.3
+    , polysemy >=1.6
+    , polysemy-conc >=0.9
+    , polysemy-time >=0.5
     , stm
     , time
   mixins:
       base hiding (Prelude)
+    , incipit-core (IncipitCore as Prelude)
+    , incipit-core hiding (IncipitCore)
   default-language: Haskell2010
 
 test-suite polysemy-log-unit
@@ -144,6 +145,7 @@
       DeriveFoldable
       DeriveFunctor
       DeriveGeneric
+      DeriveLift
       DeriveTraversable
       DerivingStrategies
       DerivingVia
@@ -176,6 +178,7 @@
       RankNTypes
       RecordWildCards
       RecursiveDo
+      RoleAnnotations
       ScopedTypeVariables
       StandaloneDeriving
       TemplateHaskell
@@ -188,18 +191,20 @@
       UndecidableInstances
       UnicodeSyntax
       ViewPatterns
-  ghc-options: -Wall -Wredundant-constraints -Wunused-packages -Widentities -threaded -rtsopts -with-rtsopts=-N
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Widentities -Wunused-packages -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      base ==4.*
-    , incipit-core >=0.2
-    , polysemy >=1.5
+      base >=4.12 && <5
+    , incipit-core >=0.3
+    , polysemy
     , polysemy-conc
     , polysemy-log
     , polysemy-plugin
-    , polysemy-test
+    , polysemy-test >=0.6
     , polysemy-time
     , tasty
     , time
   mixins:
       base hiding (Prelude)
+    , incipit-core (IncipitCore as Prelude)
+    , incipit-core hiding (IncipitCore)
   default-language: Haskell2010
diff --git a/readme.md b/readme.md
deleted file mode 100644
--- a/readme.md
+++ /dev/null
@@ -1,6 +0,0 @@
-A logging library for [Polysemy].
-
-For docs, please visit [Hackage].
-
-[Polysemy](https://hackage.haskell.org/package/polysemy)
-[Hackage](https://hackage.haskell.org/package/polysemy-log)
diff --git a/test/Polysemy/Log/Test/ConcTest.hs b/test/Polysemy/Log/Test/ConcTest.hs
--- a/test/Polysemy/Log/Test/ConcTest.hs
+++ b/test/Polysemy/Log/Test/ConcTest.hs
@@ -8,15 +8,15 @@
 
 import Polysemy.Log.Atomic (interpretDataLogAtomic)
 import Polysemy.Log.Conc (interceptDataLogConc)
-import qualified Polysemy.Log.Data.DataLog as DataLog
-import Polysemy.Log.Data.DataLog (DataLog)
+import qualified Polysemy.Log.Effect.DataLog as DataLog
+import Polysemy.Log.Effect.DataLog (DataLog)
 
 data Context =
   Context {
     context :: [Text],
     message :: Text
   }
-  deriving (Eq, Show)
+  deriving stock (Eq, Show)
 
 prog ::
   Members [DataLog Context, GhcTime, AtomicState [Context]] r =>
diff --git a/test/Polysemy/Log/Test/DataLogTest.hs b/test/Polysemy/Log/Test/DataLogTest.hs
--- a/test/Polysemy/Log/Test/DataLogTest.hs
+++ b/test/Polysemy/Log/Test/DataLogTest.hs
@@ -3,14 +3,14 @@
 import Polysemy.Test (UnitTest, assertEq, runTestAuto)
 
 import Polysemy.Log.Atomic (interpretDataLogAtomic)
-import qualified Polysemy.Log.Data.DataLog as DataLog
-import Polysemy.Log.Data.DataLog (DataLog)
+import qualified Polysemy.Log.Effect.DataLog as DataLog
+import Polysemy.Log.Effect.DataLog (DataLog)
 
 data CustomLog =
   User Text
   |
   Fatal Int
-  deriving (Eq, Show)
+  deriving stock (Eq, Show)
 
 prog ::
   Members [DataLog CustomLog, AtomicState [CustomLog]] r =>
diff --git a/test/Polysemy/Log/Test/ExampleTest.hs b/test/Polysemy/Log/Test/ExampleTest.hs
--- a/test/Polysemy/Log/Test/ExampleTest.hs
+++ b/test/Polysemy/Log/Test/ExampleTest.hs
@@ -6,7 +6,7 @@
 
 import qualified Polysemy.Log as Log
 import Polysemy.Log (DataLog, Log, interpretDataLogStdout, interpretLogStdoutConc)
-import qualified Polysemy.Log.Data.DataLog as DataLog
+import qualified Polysemy.Log.Effect.DataLog as DataLog
 
 progSimple ::
   Member Log r =>
@@ -20,7 +20,7 @@
     severity :: Text,
     message :: Text
   }
-  deriving (Eq, Show)
+  deriving stock (Eq, Show)
 
 progData ::
   Member (DataLog Message) r =>
diff --git a/test/Polysemy/Log/Test/LocalTest.hs b/test/Polysemy/Log/Test/LocalTest.hs
--- a/test/Polysemy/Log/Test/LocalTest.hs
+++ b/test/Polysemy/Log/Test/LocalTest.hs
@@ -3,17 +3,17 @@
 import Polysemy.Test (UnitTest, assertEq, runTestAuto)
 
 import Polysemy.Log.Atomic (interpretDataLogAtomic)
-import qualified Polysemy.Log.Data.DataLog as DataLog
-import Polysemy.Log.Data.DataLog (DataLog)
-import Polysemy.Log.Data.LogMessage (LogMessage(LogMessage))
-import Polysemy.Log.Data.Severity (Severity(Debug))
+import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
+import Polysemy.Log.Data.Severity (Severity (Debug))
+import qualified Polysemy.Log.Effect.DataLog as DataLog
+import Polysemy.Log.Effect.DataLog (DataLog)
 
 data Context =
   Context {
     context :: [Text],
     message :: LogMessage
   }
-  deriving (Eq, Show)
+  deriving stock (Eq, Show)
 
 log ::
   Member (DataLog Context) r =>
diff --git a/test/Polysemy/Log/Test/LogEntryTest.hs b/test/Polysemy/Log/Test/LogEntryTest.hs
--- a/test/Polysemy/Log/Test/LogEntryTest.hs
+++ b/test/Polysemy/Log/Test/LogEntryTest.hs
@@ -3,8 +3,8 @@
 import Polysemy.Test (UnitTest, assertEq, runTestAuto)
 
 import Polysemy.Log.Atomic (interpretDataLogAtomic)
-import qualified Polysemy.Log.Data.Log as Log
-import Polysemy.Log.Data.Log (Log)
+import qualified Polysemy.Log.Effect.Log as Log
+import Polysemy.Log.Effect.Log (Log)
 import qualified Polysemy.Log.Data.LogEntry as LogEntry
 import Polysemy.Log.Data.LogEntry (LogEntry)
 import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
diff --git a/test/Polysemy/Log/Test/SimpleTest.hs b/test/Polysemy/Log/Test/SimpleTest.hs
--- a/test/Polysemy/Log/Test/SimpleTest.hs
+++ b/test/Polysemy/Log/Test/SimpleTest.hs
@@ -3,8 +3,8 @@
 import Polysemy.Test (UnitTest, assertEq, runTestAuto)
 
 import Polysemy.Log.Atomic (interpretLogAtomic)
-import qualified Polysemy.Log.Data.Log as Log
-import Polysemy.Log.Data.Log (Log)
+import qualified Polysemy.Log.Effect.Log as Log
+import Polysemy.Log.Effect.Log (Log)
 import Polysemy.Log.Data.LogMessage (LogMessage(LogMessage))
 import Polysemy.Log.Data.Severity (Severity(Crit, Debug))
 
