diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,15 @@
+[1.23.1]
+
+  * Restore toJSONFilter instance for pure `a -> [a]`.
+    This went missing after my ill-considered revision to #105,
+    commit 183af9d9f1066be974ac55fd23a4c985999d3ce8 . See jgm/pandoc#8976.
+
+  * Generalize ToJSONFilter instance. Previously a pure function `a -> a`
+    could only be promoted to a filter in IO. Now we allow it to work with
+    any instance of MonadIO.  (This adds to #105.)
+
+  * Allow bytestring 0.12.
+
 [1.23.0.1]
 
   * Allow aeson 2.2.
diff --git a/pandoc-types.cabal b/pandoc-types.cabal
--- a/pandoc-types.cabal
+++ b/pandoc-types.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 Name:                pandoc-types
-version:             1.23.0.1
+version:             1.23.1
 Synopsis:            Types for representing a structured document
 Description:         @Text.Pandoc.Definition@ defines the 'Pandoc' data
                      structure, which is used by pandoc to represent
@@ -32,9 +32,6 @@
 Copyright:           (c) 2006-2023 John MacFarlane
 Category:            Text
 Build-type:          Simple
-Tested-With:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.2,
-                     GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.7,
-                     GHC == 9.0.2, GHC == 9.2.5, GHC == 9.4.4
 Extra-Source-Files:  changelog
 Source-repository    head
   type:              git
@@ -56,7 +53,7 @@
                      deepseq >= 1.4.1 && < 1.5,
                      syb >= 0.1 && < 0.8,
                      ghc-prim >= 0.2,
-                     bytestring >= 0.9 && < 0.12,
+                     bytestring >= 0.9 && < 0.13,
                      aeson >= 0.6.2 && < 2.3,
                      transformers >= 0.2 && < 0.7,
                      QuickCheck >= 2.10 && < 2.15
@@ -76,7 +73,7 @@
                        aeson >= 0.6.2 && < 2.3,
                        containers >= 0.3,
                        text,
-                       bytestring >= 0.9 && < 0.12,
+                       bytestring >= 0.9 && < 0.13,
                        test-framework >= 0.3 && < 0.9,
                        test-framework-hunit >= 0.2 && < 0.4,
                        test-framework-quickcheck2 >= 0.2.9 && < 0.4,
diff --git a/src/Text/Pandoc/JSON.hs b/src/Text/Pandoc/JSON.hs
--- a/src/Text/Pandoc/JSON.hs
+++ b/src/Text/Pandoc/JSON.hs
@@ -103,9 +103,15 @@
 class ToJSONFilter m a where
   toJSONFilter :: a -> m ()
 
-instance (Walkable a Pandoc) => ToJSONFilter IO (a -> a) where
-  toJSONFilter f = BL.getContents >>=
+instance (Walkable a Pandoc, MonadIO m) => ToJSONFilter m (a -> a) where
+  toJSONFilter f = liftIO $ BL.getContents >>=
     BL.putStr . encode . (walk f :: Pandoc -> Pandoc) . either error id .
+    eitherDecode'
+
+instance (Walkable [a] Pandoc, MonadIO m) => ToJSONFilter m (a -> [a]) where
+  toJSONFilter f = liftIO $ BL.getContents >>=
+    BL.putStr . encode . (walk (concatMap f) :: Pandoc -> Pandoc) .
+    either error id .
     eitherDecode'
 
 instance (Walkable a Pandoc, MonadIO m) => ToJSONFilter m (a -> m a) where
