diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.1.0.4
+
+- Add `Generic` instances to `Span` and `Position`
+
 # 0.1.0.3
 
 - Add `prettySpan` function
diff --git a/parsix.cabal b/parsix.cabal
--- a/parsix.cabal
+++ b/parsix.cabal
@@ -1,5 +1,5 @@
 name:                parsix
-version:             0.1.0.3
+version:             0.1.0.4
 synopsis:            Parser combinators with slicing, error recovery, and syntax highlighting
 description:         A parser combinator library based on 'parsers' (like 'trifecta') with slicing, error recovery, and syntax highlighted diagnostics
 homepage:            https://github.com/ollef/parsix
diff --git a/src/Text/Parsix/Position.hs b/src/Text/Parsix/Position.hs
--- a/src/Text/Parsix/Position.hs
+++ b/src/Text/Parsix/Position.hs
@@ -1,7 +1,8 @@
-{-# LANGUAGE BangPatterns, OverloadedStrings #-}
+{-# LANGUAGE BangPatterns, DeriveGeneric, OverloadedStrings #-}
 module Text.Parsix.Position where
 
 import Data.Semigroup
+import GHC.Generics
 import Data.Text(Text)
 import qualified Data.Text as Text
 import Data.Text.Prettyprint.Doc
@@ -15,7 +16,7 @@
   { codeUnits :: !Int
   , visualRow :: !Int
   , visualColumn :: !Int
-  } deriving (Eq, Ord, Show)
+  } deriving (Eq, Ord, Show, Generic)
 
 next :: Char -> Int -> Position -> Position
 next !c !delta !pos = Position
@@ -49,7 +50,7 @@
 data Span = Span
   { spanStart :: !Position
   , spanEnd :: !Position
-  } deriving (Eq, Ord, Show)
+  } deriving (Eq, Ord, Show, Generic)
 
 prettySpan
   :: (Highlight -> AnsiStyle)
