diff --git a/Changelog.md b/Changelog.md
deleted file mode 100644
--- a/Changelog.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,3 @@
+# 0.1.1.0
+
+* Add `Exon` instance for `String -> String`, used by `showsPrec`.
diff --git a/exon.cabal b/exon.cabal
--- a/exon.cabal
+++ b/exon.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           exon
-version:        0.1.0.0
+version:        0.1.1.0
 synopsis:       Monoidal Quasiquote Interpolation
 description:    See <https://hackage.haskell.org/package/exon/docs/Exon.html>
 category:       String
@@ -19,7 +19,7 @@
 build-type:     Simple
 extra-source-files:
     readme.md
-    Changelog.md
+    changelog.md
 
 source-repository head
   type: git
@@ -121,6 +121,7 @@
   other-modules:
       Exon.Test.BasicTest
       Exon.Test.Quote
+      Exon.Test.ShowsPrecTest
       Paths_exon
   hs-source-dirs:
       test
diff --git a/lib/Exon/Class/Exon.hs b/lib/Exon/Class/Exon.hs
--- a/lib/Exon/Class/Exon.hs
+++ b/lib/Exon/Class/Exon.hs
@@ -1,6 +1,8 @@
 -- |Description: Internal
 module Exon.Class.Exon where
 
+import Text.Show (showString)
+
 import Exon.Data.Result (Result (Empty, Result))
 import qualified Exon.Data.Segment as Segment
 import Exon.Data.Segment (Segment)
@@ -159,6 +161,29 @@
 instance Exon ExonDefault LByteString where
   convertSegment =
     convertKeepWs
+
+  concatSegments =
+    concatKeepWs @ExonDefault
+
+instance Exon ExonDefault (String -> String) where
+  convertSegment = \case
+    Segment.String a ->
+      Result (showString a)
+    Segment.Expression a | isEmpty @ExonDefault a ->
+      Empty
+    Segment.Expression a ->
+      Result a
+    Segment.Whitespace ws ->
+      Result (showString ws)
+
+  appendSegment z a =
+    case (z, convertSegment @ExonDefault a) of
+      (Result z', Result a') ->
+        Result (z' . a')
+      (z', Empty) ->
+        z'
+      (Empty, a') ->
+        a'
 
   concatSegments =
     concatKeepWs @ExonDefault
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -1,4 +1,5 @@
 This Haskell library provides quasiquote string interpolation with customizable concatenation for arbitrary types.
+Visit [hackage] to read the full API documentation.
 
 The default case uses `Monoid` and `IsString`:
 
@@ -27,6 +28,23 @@
 
 The default implementation ignores whitespace when concatenating, while it is preserved for `String`, `Text` etc.
 
+An instance for `String -> String` is provided, used by `showsPrec` for example:
+
+```haskell
+
+data Record =
+  Record {
+    number :: Int,
+    maybeNumber :: Maybe Int,
+    value :: Value
+  }
+
+instance Show Record where
+  showsPrec d Record {..} =
+    showParen (d > 10) $
+      [exon|Record #{showsPrec 11 number} #{showsPrec 11 maybeNumber} #{showsPrec 11 value}|]
+```
+
 # Customization
 
 Concatenation is performed by the class `Exon.Exon`:
@@ -63,4 +81,5 @@
 
 Inspired by the magnificent [string-interpolate].
 
+[hackage]: https://hackage.haskell.org/package/exon/docs/Exon.html
 [string-interpolate]: https://hackage.haskell.org/package/string-interpolate
diff --git a/test/Exon/Test/ShowsPrecTest.hs b/test/Exon/Test/ShowsPrecTest.hs
new file mode 100644
--- /dev/null
+++ b/test/Exon/Test/ShowsPrecTest.hs
@@ -0,0 +1,34 @@
+module Exon.Test.ShowsPrecTest where
+
+import Hedgehog (TestT, (===))
+import Text.Show (showParen, showsPrec)
+
+import Exon.Quote (exon)
+
+data Value =
+  Value {
+    x :: Int,
+    y :: Int
+  }
+  deriving (Eq, Show)
+
+data Record =
+  Record {
+    number :: Int,
+    maybeNumber :: Maybe Int,
+    value :: Value
+  }
+  deriving (Eq)
+
+data Wrap =
+  Wrap Int Record
+  deriving (Eq, Show)
+
+instance Show Record where
+  showsPrec d Record {..} =
+    showParen (d > 10) $
+      [exon|Record #{showsPrec 11 number} #{showsPrec 11 maybeNumber} #{showsPrec 11 value}|]
+
+test_showsPrec :: TestT IO ()
+test_showsPrec =
+  "Wrap 1 (Record 5 (Just 10) (Value {x = 3, y = 4}))" === show @Text (Wrap 1 (Record 5 (Just 10) (Value 3 4)))
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,6 +1,7 @@
 module Main where
 
 import Exon.Test.BasicTest (test_basic, test_keepWhitespace)
+import Exon.Test.ShowsPrecTest (test_showsPrec)
 import Hedgehog (TestT, property, test, withTests)
 import Test.Tasty (TestName, TestTree, defaultMain, testGroup)
 import Test.Tasty.Hedgehog (testProperty)
@@ -16,7 +17,8 @@
 tests =
   testGroup "all" [
     unitTest "basic" test_basic,
-    unitTest "keep whitespace" test_keepWhitespace
+    unitTest "keep whitespace" test_keepWhitespace,
+    unitTest "concat showsPrec fragments" test_showsPrec
   ]
 
 main :: IO ()
