diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,16 @@
 # Revision history for threadscope
 
+## 2022-05-10 - v0.2.14.1
+
+* Spelling fixes ([#121](https://github.com/haskell/ThreadScope/pull/121), [#123](https://github.com/haskell/ThreadScope/pull/123))
+* Add compatibility with GHC-9.2 ([#124](https://github.com/haskell/ThreadScope/pull/124), [＃125](https://github.com/haskell/ThreadScope/pull/125))
+* Update dependencies ([#126](https://github.com/haskell/ThreadScope/pull/126))
+
 ## 2021-01-09 - v0.2.14
 
-* Print times with more sensible units [#111](https://github.com/haskell/ThreadScope/pull/111)
-* EventDuration: Make it more robust to truncated eventlogs [#110](https://github.com/haskell/ThreadScope/pull/110)
-* Use GitHub Actions for CI [#113](https://github.com/haskell/ThreadScope/pull/113)
+* Print times with more sensible units ([#111](https://github.com/haskell/ThreadScope/pull/111))
+* EventDuration: Make it more robust to truncated eventlogs ([#110](https://github.com/haskell/ThreadScope/pull/110))
+* Use GitHub Actions for CI ([#113](https://github.com/haskell/ThreadScope/pull/113))
 * Relax upper version bounds for ghc-events, time, bytestring, and template-haskell
 
 ## 2020-04-06 - v0.2.13
diff --git a/Events/EventDuration.hs b/Events/EventDuration.hs
--- a/Events/EventDuration.hs
+++ b/Events/EventDuration.hs
@@ -17,9 +17,9 @@
 import qualified GHC.RTS.Events as GHC
 
 -------------------------------------------------------------------------------
--- This datastructure is a duration-based representation of the event
--- loginformation where thread-runs and GCs are explicitly represented
--- by a single constructor identifying their start and end points.
+-- This data structure is a duration-based representation of the eventlog
+-- information where thread-runs and GCs are explicitly represented by a
+-- single constructor identifying their start and end points.
 
 data EventDuration
   = ThreadRun {-#UNPACK#-}!ThreadId
diff --git a/Events/ReadEvents.hs b/Events/ReadEvents.hs
--- a/Events/ReadEvents.hs
+++ b/Events/ReadEvents.hs
@@ -35,12 +35,12 @@
 -- import qualified GHC.RTS.Events as GHCEvents
 --
 -- The GHC.RTS.Events library returns the profile information
--- in a data-streucture which contains a list data structure
+-- in a data-structure which contains a list data structure
 -- representing the events i.e. [GHCEvents.Event]
 -- ThreadScope transforms this list into an alternative representation
 -- which (for each HEC) records event *durations* which are ordered in time.
 -- The durations represent the run-lengths for thread execution and
--- run-lengths for garbage colleciton. This data-structure is called
+-- run-lengths for garbage collection. This data-structure is called
 -- EventDuration.
 -- ThreadScope then transformations this data-structure into another
 -- data-structure which gives a binary-tree view of the event information
@@ -207,7 +207,7 @@
       allHisto :: [(Timestamp, Int, Timestamp)]
       allHisto = catMaybes . sparkSummary M.empty . toList $ sparkProfile
 
-      -- Sparks of zero lenght are already well visualized in other graphs:
+      -- Sparks of zero length are already well visualized in other graphs:
       durHistogram = filter (\ (_, logdur, _) -> logdur > 0) allHisto
       -- Precompute some extremums of the maximal interval, needed for scales.
       durs = [(logdur, dur) | (_start, logdur, dur) <- durHistogram]
diff --git a/Events/SparkStats.hs b/Events/SparkStats.hs
--- a/Events/SparkStats.hs
+++ b/Events/SparkStats.hs
@@ -24,7 +24,7 @@
 -- | Create spark stats for a duration, given absolute
 -- numbers of sparks in all categories at the start and end of the duration.
 -- The units for spark transitions (first 6 counters) is [spark/duration]:
--- the fact that intervals may have different lenghts is ignored here.
+-- the fact that intervals may have different lengths is ignored here.
 -- The units for the pool stats are just [spark].
 -- The values in the second counter have to be greater or equal
 -- to the values in the first counter, except for the spark pool size.
diff --git a/Events/TestEvents.hs b/Events/TestEvents.hs
--- a/Events/TestEvents.hs
+++ b/Events/TestEvents.hs
@@ -119,7 +119,7 @@
      EventType wakeup "Wakeup thread" (Just 10),
      EventType startGC "Start GC" (Just 0),
      EventType finishGC "Finish GC" (Just 0),
-     EventType reqSeqGC "Request sequetial GC" (Just 0),
+     EventType reqSeqGC "Request sequential GC" (Just 0),
      EventType reqParGC "Reqpargc parallel GC" (Just 0),
      EventType createSparkThread "Create spark thread" (Just 8),
      EventType logMessage "Log message" Nothing,
diff --git a/GUI/App.hs b/GUI/App.hs
--- a/GUI/App.hs
+++ b/GUI/App.hs
@@ -9,6 +9,6 @@
 -------------------------------------------------------------------------------
 
 -- | Initialize application
--- Perform application initialization for non-Mac OS X platforms
+-- Perform application initialization for non-macOS platforms
 initApp :: IO ()
 initApp = return ()
diff --git a/GUI/DataFiles.hs b/GUI/DataFiles.hs
--- a/GUI/DataFiles.hs
+++ b/GUI/DataFiles.hs
@@ -21,7 +21,7 @@
 logoFile :: FilePath
 logoFile = "threadscope.png"
 
--- | Textual representaion of the UI file
+-- | Textual representation of the UI file
 ui :: Q Exp
 ui = [| TE.decodeUtf8 $(makeRelativeToProject uiFile >>= embedFile) |]
 
diff --git a/GUI/KeyView.hs b/GUI/KeyView.hs
--- a/GUI/KeyView.hs
+++ b/GUI/KeyView.hs
@@ -106,10 +106,10 @@
      "In the spark conversion  graph the coloured area represents the number " ++
      "of sparks that have fizzled.")
   , ("GCed spark",      KEventAndGraph, gcColour,
-     "As an event it indicates a spark has been GC'd, meaning it has been " ++
+     "As an event it indicates a spark has been GCed, meaning it has been " ++
      "discovered that the spark's thunk was no longer needed anywhere. " ++
      "In the spark conversion graph the coloured area represents the number " ++
-     "of sparks that were GC'd.")
+     "of sparks that were GCed.")
   ]
 
 
@@ -136,7 +136,7 @@
 renderKeyIcon KEvent keyColour = renderKEvent keyColour
 renderKeyIcon KEventAndGraph keyColour = do
   renderKEvent keyColour
-  -- An icon roughly repreenting a jagedy graph.
+  -- An icon roughly representing a jaggedy graph.
   let x = fromIntegral ox
       y = fromIntegral hecBarHeight
   C.moveTo    (2*x)    (y - 2)
diff --git a/GUI/SaveAs.hs b/GUI/SaveAs.hs
--- a/GUI/SaveAs.hs
+++ b/GUI/SaveAs.hs
@@ -27,7 +27,7 @@
 
 saveAs :: HECs -> ViewParameters -> Double -> DrawingArea
        -> (Int, Int, Render ())
-saveAs hecs params' @ViewParameters{xScaleAreaHeight, width,
+saveAs hecs params'@ViewParameters{xScaleAreaHeight, width,
                                     height = oldHeight {-, histogramHeight-}}
        yScaleAreaWidth yScaleArea =
   let histTotalHeight = histXScaleHeight -- + histogramHeight
diff --git a/GUI/SummaryView.hs b/GUI/SummaryView.hs
--- a/GUI/SummaryView.hs
+++ b/GUI/SummaryView.hs
@@ -124,7 +124,7 @@
       [ cellText := show ovf ]
     addSparksColumn "Dud" $ \(_, SparkCounts _ _ _ dud _ _) ->
       [ cellText := show dud ]
-    addSparksColumn "GC'd" $ \(_, SparkCounts _ _ _ _ gc _) ->
+    addSparksColumn "GCed" $ \(_, SparkCounts _ _ _ _ gc _) ->
       [ cellText := show gc ]
     addSparksColumn "Fizzled" $ \(_, SparkCounts _ _ _ _ _ fiz) ->
       [ cellText := show fiz ]
@@ -714,7 +714,7 @@
       -- For events that contain discrete increments. We assume the event
       -- is emitted close to the end of the process it measures,
       -- so we ignore the first found event, because most of the process
-      -- could have happened before the start of the current inverval.
+      -- could have happened before the start of the current interval.
       -- This is consistent with @alterCounter@. For interval beginning
       -- at time 0, we start with @Just 0@.
       alterIncrement _ Nothing = Just 0
@@ -881,7 +881,7 @@
                         }
                   -- Cap is not in the GC. Mark it as idle to complete
                   -- the identification of caps that take part
-                  -- in the current GC. Without overwritin the mode,
+                  -- in the current GC. Without overwriting the mode,
                   -- the cap could be processed later on as if
                   -- it took part in the GC, giving wrong results.
                   ModeEnd  -> dGC { gcMode = ModeIdle }
@@ -934,7 +934,7 @@
                  ModeIdle  -> errorAs "scanEvents: EndGC ModeIdle"
                               $ sd { dGCTable = IM.insert cap endedGC dGCTable }
           SparkCounters crt dud ovf cnv fiz gcd _rem ->
-            -- We are guranteed the first spark counters event has all zeroes,
+            -- We are guaranteed the first spark counters event has all zeroes,
             -- do we don't need to rig the counters for maximal interval.
             let current = RtsSpark crt dud ovf cnv fiz gcd
             in sd { dsparkTable =
diff --git a/GUI/Timeline.hs b/GUI/Timeline.hs
--- a/GUI/Timeline.hs
+++ b/GUI/Timeline.hs
@@ -331,7 +331,7 @@
     return (xv, xv')
 
 -------------------------------------------------------------------------------
--- Update the internal state and the timemline view after changing which
+-- Update the internal state and the timeline view after changing which
 -- traces are displayed, or the order of traces.
 
 queueRedrawTimelines :: TimelineState -> IO ()
diff --git a/GUI/Timeline/Render.hs b/GUI/Timeline/Render.hs
--- a/GUI/Timeline/Render.hs
+++ b/GUI/Timeline/Render.hs
@@ -170,7 +170,7 @@
 -------------------------------------------------------------------------------
 
 -- We currently have two different way of converting from logical units
--- (ie timestamps in micro-seconds) to device units (ie pixels):
+-- (i.e. timestamps in micro-seconds) to device units (i.e. pixels):
 --   * the first is to set the cairo context to the appropriate scale
 --   * the second is to do the conversion ourself
 --
@@ -450,7 +450,7 @@
   "Activity"
 showTrace _ TraceGroup{} = error "Render.showTrace"
 
--- | Calcaulate the maximal Y value for a graph-like trace, or Nothing.
+-- | Calculate the maximal Y value for a graph-like trace, or Nothing.
 traceMaxSpark :: Double -> Double -> Double -> Trace -> Maybe Double
 traceMaxSpark maxS _ _ TraceCreationHEC{}   = Just $ maxS * 1000
 traceMaxSpark maxS _ _ TraceConversionHEC{} = Just $ maxS * 1000
diff --git a/GUI/Timeline/Render/Constants.hs b/GUI/Timeline/Render/Constants.hs
--- a/GUI/Timeline/Render/Constants.hs
+++ b/GUI/Timeline/Render/Constants.hs
@@ -18,7 +18,7 @@
 firstTraceY :: Int
 firstTraceY = 13
 
--- Gap betweem traces in the timeline view
+-- Gap between traces in the timeline view
 
 tracePad :: Int
 tracePad = 20
diff --git a/GUI/Timeline/Sparks.hs b/GUI/Timeline/Sparks.hs
--- a/GUI/Timeline/Sparks.hs
+++ b/GUI/Timeline/Sparks.hs
@@ -239,7 +239,7 @@
     drawVRulers
     drawHRulers
     -- Move to the bottom and draw the X scale. The Y scale is drawn
-    -- independetly in another drawing area.
+    -- independently in another drawing area.
     translate 0 (fromIntegral histogramHeight)
     drawXScale
     restore
diff --git a/GUI/Timeline/Ticks.hs b/GUI/Timeline/Ticks.hs
--- a/GUI/Timeline/Ticks.hs
+++ b/GUI/Timeline/Ticks.hs
@@ -86,7 +86,7 @@
 data XScaleMode = XScaleTime | XScaleLog Double Double deriving Eq
 
 -- | Render the X (vertical) scale: render X axis and call ticks rendering.
--- TODO: refactor common parts with renderVRulers, in particlar to expose
+-- TODO: refactor common parts with renderVRulers, in particular to expose
 -- that ruler positions match tick positions.
 renderXScale :: Double -> Double -> Timestamp -> Int
              -> (Int -> Int) -> XScaleMode
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,18 +2,17 @@
 
 [![Hackage](https://img.shields.io/hackage/v/threadscope.svg)](https://hackage.haskell.org/package/threadscope)
 [![Hackage-Deps](https://img.shields.io/hackage-deps/v/threadscope.svg)](http://packdeps.haskellers.com/feed?needle=threadscope)
-[![Build Status](https://travis-ci.org/haskell/ThreadScope.svg?branch=master)](https://travis-ci.org/haskell/ThreadScope)
-[![Build status](https://ci.appveyor.com/api/projects/status/tiwkb7k6p38dde03/branch/master?svg=true)](https://ci.appveyor.com/project/maoe/threadscope-44t6e/branch/master)
+![CI](https://github.com/haskell/ThreadScope/workflows/CI/badge.svg?branch=master)
 
 ## Using pre-built binaries
 
 Currently [pre-built binaries](https://github.com/haskell/ThreadScope/releases) for the following platforms are provided:
 
-* Ubuntu Trusty (64-bit)
-* macOS (XCode 11)
-* Windows (x64)
+* Ubuntu 18.04 (64-bit)
+* macOS 10.15
+* Windows Server 2019 (x64)
 
-GTK+2 needs to be installed for those binaries to work.
+GTK+2 needs to be installed for these binaries to work.
 
 On Windows, the [MSYS2](http://www.msys2.org) is the recommended way to install GTK+2. In MSYS2 MINGW64 shell:
 
@@ -25,7 +24,7 @@
 
 ## Building from source
 
-Use `git clone` or `cabal unpack threadscope` to get the source and move into the threadscope directory.
+Use `git clone` or `cabal get threadscope` to get the source and move into the threadscope directory.
 
 ### Linux
 
@@ -49,12 +48,12 @@
 stack install # to build and install the binary
 ```
 
-### OS X
+### macOS
 
-GTK+ and GCC 9 are required:
+GTK+ is required:
 
 ```sh
-brew install gtk+ gcc@9
+brew install gtk+
 ```
 
 Then you can build threadscope using cabal:
diff --git a/threadscope.cabal b/threadscope.cabal
--- a/threadscope.cabal
+++ b/threadscope.cabal
@@ -1,6 +1,6 @@
 Cabal-version:       1.24
 Name:                threadscope
-Version:             0.2.14
+Version:             0.2.14.1
 Category:            Development, Profiling, Trace
 Synopsis:            A graphical tool for profiling parallel Haskell programs.
 Description:         ThreadScope is a graphical viewer for thread profile
@@ -36,11 +36,10 @@
 Extra-source-files:  include/windows_cconv.h
                      README.md
                      CHANGELOG.md
-Tested-with:         GHC == 8.2.2
-                     GHC == 8.4.4
-                     GHC == 8.6.5
-                     GHC == 8.8.4
-                     GHC == 8.10.3
+Tested-with:         GHC == 8.8.4
+                     GHC == 8.10.7
+                     GHC == 9.0.2
+                     GHC == 9.2.2
 
 source-repository head
   type:     git
@@ -57,14 +56,14 @@
                      array < 0.6,
                      mtl < 2.3,
                      filepath < 1.5,
-                     ghc-events >= 0.13 && < 0.16,
+                     ghc-events >= 0.13 && < 0.18,
                      containers >= 0.2 && < 0.7,
                      deepseq >= 1.1,
-                     text < 1.3,
-                     time >= 1.1 && < 1.12,
+                     text < 2.1,
+                     time >= 1.1 && < 1.13,
                      bytestring < 0.12,
                      file-embed < 0.1,
-                     template-haskell < 2.17,
+                     template-haskell < 2.19,
                      temporary >= 1.1 && < 1.4
 
   include-dirs:      include
