diff --git a/CHANGELOG b/CHANGELOG
deleted file mode 100644
--- a/CHANGELOG
+++ /dev/null
@@ -1,13 +0,0 @@
-# v1.6 _(2020-03-01)_
-- Removed an erroneous `Monoid` constraint from `SeriesNE`
-- Added locations to a few node types.
-- Wrapped 'Text' nodes in 'Fragment'.
-
-# v1.5.0.1 _(2020-02-24)_
-- Added `CHANGELOG` to its own file.
-- Included `CHANGELOG` and `README.pro` in the source distribution.
-- Added an optic for fetching the name of a `Tag`.
-
-# v1.5.0.0 _(2020-02-23)_
-- Added tests for GHC 8.4.4 through 8.6.1.
-- Initial stable release.
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,18 @@
+# v1.6.0.1 _(2020-03-13)_
+- Added patterns to `Series` and `SeriesNE` to make for easier pattern
+  matching.
+- Added the `BlockRegion`, `InlineRegion`, and `LiteralRegion` synonyms.
+
+# v1.6 _(2020-03-01)_
+- Removed an erroneous `Monoid` constraint from `SeriesNE`
+- Added locations to a few node types.
+- Wrapped 'Text' nodes in 'Fragment'.
+
+# v1.5.0.1 _(2020-02-24)_
+- Added `CHANGELOG` to its own file.
+- Included `CHANGELOG` and `README.pro` in the source distribution.
+- Added an optic for fetching the name of a `Tag`.
+
+# v1.5.0.0 _(2020-02-23)_
+- Added tests for GHC 8.4.4 through 8.6.1.
+- Initial stable release.
diff --git a/README.pro b/README.pro
--- a/README.pro
+++ b/README.pro
@@ -4,6 +4,9 @@
 #link[uri='https://ci.fldcr.com/prosidy/prosidy']{
 #image[uri='https://ci.fldcr.com/api/badges/prosidy/prosidy/status.svg', desc='Build Status']
 }
+#link[uri='https://hackage.haskell.org/packages/prosidy']{
+#image[uri='https://img.shields.io/hackage/v/prosidy', desc='Hackage']
+}
 
 Prosidy is a small language for writing documents.
 
@@ -31,7 +34,42 @@
 That said, feedback is more than welcome!
 Reach me at #link[uri='mailto:alex@fldcr.com']{alex@fldcr.com}.
 
-#-h{Developing Prosidy}
-This project sets up an environment using direnv and Nix.
-We'd recommend you have both installed before building,
-although it may work without both.
+
+#-h{Related projects}
+
+#-h+{VSCode plugin}
+#-list:
+  #-item:
+    homepage:
+    #link[uri='https://marketplace.visualstudio.com/items?itemName=prosidy.prosidy']{
+        marketplace.visualstudio.com/items?itemName=prosidy.prosidy
+    }
+  #:
+  #-item:
+    source: 
+    #link[uri='https://git.fldcr.com/prosidy/vscode']{
+        git.fldcr.com/prosidy/vscode
+    }
+  #:
+#:
+Official VSCode support for the Prosidy language.
+
+
+#-h+{#lit{prosidyc}}
+#-list:
+  #-item:
+    homepage:
+    #link[uri='https://hackage.haskell.org/packages/prosidyc']{
+        hackage.haskell.org/packages/prosidyc
+    }
+  #:
+  #-item:
+    source: 
+    #link[uri='https://git.fldcr.com/prosidy/prosidyc']{
+        git.fldcr.com/prosidy/prosidyc
+    }
+  #:
+#:
+The #lit{prosidyc} Haskell library provides a small DSL for compiling
+Prosidy documents into other formats, ensuring that source locations are
+attached to error messages.
diff --git a/prosidy.cabal b/prosidy.cabal
--- a/prosidy.cabal
+++ b/prosidy.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                prosidy
-version:             1.6.0.0
+version:             1.6.0.1
 synopsis:            A simple language for writing documents.
 license:             MPL-2.0
 license-file:        LICENSE
@@ -10,7 +10,7 @@
 category:            Language
 data-dir:            data
 data-files:          golden/**/*.pro, golden/**/*.json
-extra-source-files:  CHANGELOG, README.pro
+extra-source-files:  CHANGELOG.md, README.pro
 
 tested-with:
     GHC == 8.4.4
diff --git a/src/Prosidy/Types.hs b/src/Prosidy/Types.hs
--- a/src/Prosidy/Types.hs
+++ b/src/Prosidy/Types.hs
@@ -30,6 +30,11 @@
     , LiteralTag
     , tagToRegion
     , regionToTag
+      -- * Regions
+    , Region(..)
+    , BlockRegion
+    , InlineRegion
+    , LiteralRegion
       -- * Contextual enumerations
     , Block(..)
     , Inline(..)
@@ -37,7 +42,6 @@
     , Paragraph(..)
       -- * Common structures
     , Metadata(..)
-    , Region(..)
       -- * Textual fragments
     , Fragment(..)
       -- * Utility wrappers
@@ -315,13 +319,25 @@
 -- Specified in Prosidy source with the @#-@ sigil.
 type BlockTag = Tag (Series Block)
 
+-- | A 'Region' containing a zero or more 'Block' items. Like 'BlockTag',
+-- without a tag name.
+type BlockRegion = Region (Series Block)
+
 -- | A 'Tag' containing zero or more 'Inline' items.
 -- Specified in Prosidy source with the @#@ sigil.
 type InlineTag = Tag (Series Inline)
 
+-- | A 'Region' containing a zero or more 'Inline' items. Like 'InlineTag',
+-- without a tag name.
+type InlineRegion = Region (Series Inline)
+
 -- | A 'Tag' containing a single plain-text item.
 -- Specified in Prosidy source with the @#=@ sigil.
 type LiteralTag = Tag Text
+
+-- | A 'Region' containing a single plain-text item. Like 'LiteralTag', without
+-- a tag name.
+type LiteralRegion = Region Text
 
 -- | Convert a 'Tag' to a 'Region' by discarding the tag's name.
 tagToRegion :: Tag a -> Region a
diff --git a/src/Prosidy/Types/Series.hs b/src/Prosidy/Types/Series.hs
--- a/src/Prosidy/Types/Series.hs
+++ b/src/Prosidy/Types/Series.hs
@@ -7,6 +7,8 @@
 -}
 {-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 module Prosidy.Types.Series
     ( -- * Possibly empty collections
@@ -18,6 +20,13 @@
     , SeriesNE
     , fromSeqNE
     , toSeqNE
+      -- * Pattern synonyms for easy manipulation of series
+    , pattern NonEmpty
+    , pattern Empty
+    , pattern (:>>:)
+    , pattern (:<<:)
+    , pattern (:>:)
+    , pattern (:<:)
     )
 where
 
@@ -57,7 +66,7 @@
 instance Traversable Series where
     traverse f (Series xs) = Series <$> traverse f xs
 
--- | A non-empty 'Series'. 
+-- | A non-empty 'Series'.
 newtype SeriesNE a = SeriesNE (Seq a)
   deriving stock (Generic, Show)
   deriving newtype (Eq, Foldable, Functor, Applicative, ToJSON, NFData, Semigroup)
@@ -84,6 +93,50 @@
 
 instance Traversable SeriesNE where
     traverse f (SeriesNE xs) = SeriesNE <$> traverse f xs
+
+pattern FromSeries :: Series a -> Seq a
+pattern FromSeries a <- (fromSeq -> a)
+
+-- | Matches against an empty 'Series'.
+pattern Empty :: Series a
+pattern Empty = Series Seq.Empty
+
+-- | Matches a non-empty 'SeriesNE' as if it were just a 'Series'.
+pattern NonEmpty :: SeriesNE a -> Series a
+pattern NonEmpty a <- (seriesNE -> Just a)
+  where NonEmpty (SeriesNE a) = Series a
+
+-- | Match against the first element of a 'Series'.
+infixr 5 :<:
+pattern (:<:) :: a -> Series a -> Series a
+pattern a :<: b <- Series (a Seq.:<| FromSeries b)
+  where a :<: Series b = Series (a Seq.:<| b)
+
+-- | Match against the last element of a 'Series'.
+infixl 5 :>:
+pattern (:>:) :: Series a -> a -> Series a
+pattern a :>: b <- Series (FromSeries a Seq.:|> b)
+  where Series a :>: b = Series (a Seq.:|> b)
+
+-- | Match against a non-empty 'SeriesNE' and a leading element.
+infixr 3 :<<:
+pattern (:<<:) :: a -> Series a -> SeriesNE a
+pattern a :<<: b <- SeriesNE (a Seq.:<| FromSeries b)
+  where a :<<: Series b = SeriesNE (a Seq.:<| b)
+
+-- | Match against a non-empty 'SeriesNE' and a trailing element.
+infixl 3 :>>:
+pattern (:>>:) :: Series a -> a -> SeriesNE a
+pattern a :>>: b <- SeriesNE (FromSeries a Seq.:|> b)
+  where Series a :>>: b = SeriesNE (a Seq.:|> b)
+
+seriesNE :: Series a -> Maybe (SeriesNE a)
+seriesNE = fromSeqNE . toSeq
+
+{-# COMPLETE (:<<:) #-}
+{-# COMPLETE (:>>:) #-}
+{-# COMPLETE (:>:), Empty #-}
+{-# COMPLETE (:<:), Empty #-}
 
 -- | Given a function which operates on a 'Seq', return a function which
 -- operates on a 'Series'.
