diff --git a/eventlog-live-otelcol.cabal b/eventlog-live-otelcol.cabal
--- a/eventlog-live-otelcol.cabal
+++ b/eventlog-live-otelcol.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.0
 name:            eventlog-live-otelcol
-version:         0.1.0.3
+version:         0.1.0.4
 synopsis:        Stream eventlog data to the OpenTelemetry Collector.
 description:
   This executable supports live streaming of eventlog data into
@@ -104,6 +104,7 @@
   hs-source-dirs:  src
   autogen-modules: Paths_eventlog_live_otelcol
   other-modules:
+    Options.Applicative.Compat
     Paths_eventlog_live_otelcol
     System.Random.Compat
 
@@ -121,7 +122,7 @@
     , hs-opentelemetry-otlp  >=0.1.0  && <0.2
     , lens-family            >=2.1.3  && <2.2
     , machines               >=0.7.4  && <0.8
-    , optparse-applicative   >=0.19   && <0.20
+    , optparse-applicative   >=0.17   && <0.20
     , proto-lens             >=0.7.1  && <0.8
     , random                 >=1.2    && <1.4
     , text                   >=1.2    && <2.2
diff --git a/src/GHC/Eventlog/Live/Otelcol.hs b/src/GHC/Eventlog/Live/Otelcol.hs
--- a/src/GHC/Eventlog/Live/Otelcol.hs
+++ b/src/GHC/Eventlog/Live/Otelcol.hs
@@ -46,7 +46,8 @@
 import Network.GRPC.Common.Protobuf (Protobuf)
 import Network.GRPC.Common.Protobuf qualified as G
 import Options.Applicative qualified as O
-import Options.Applicative.Extra qualified as O
+import Options.Applicative.Compat qualified as OC
+import Options.Applicative.Extra qualified as OE
 import Paths_eventlog_live_otelcol qualified as EventlogLive
 import Proto.Opentelemetry.Proto.Collector.Metrics.V1.MetricsService qualified as OMS
 import Proto.Opentelemetry.Proto.Collector.Metrics.V1.MetricsService_Fields qualified as OMS
@@ -692,8 +693,8 @@
 options =
   O.info
     ( optionsParser
-        O.<**> O.helperWith (O.long "help" <> O.help "Show this help text.")
-        O.<**> O.simpleVersioner (showVersion EventlogLive.version)
+        O.<**> OE.helperWith (O.long "help" <> O.help "Show this help text.")
+        O.<**> OC.simpleVersioner (showVersion EventlogLive.version)
     )
     O.idm
 
@@ -746,7 +747,7 @@
 
 openTelemetryCollectorOptionsParser :: O.Parser OpenTelemetryCollectorOptions
 openTelemetryCollectorOptionsParser =
-  O.parserOptionGroup "OpenTelemetry Collector Server Options" $
+  OC.parserOptionGroup "OpenTelemetry Collector Server Options" $
     OpenTelemetryCollectorOptions
       <$> otelcolServerParser
       <*> otelcolExporterOptionsParsers
diff --git a/src/Options/Applicative/Compat.hs b/src/Options/Applicative/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Options/Applicative/Compat.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE CPP #-}
+
+module Options.Applicative.Compat (
+  parserOptionGroup,
+  simpleVersioner,
+) where
+
+#if MIN_VERSION_optparse_applicative(0,19,0)
+import Options.Applicative (parserOptionGroup)
+import Options.Applicative (simpleVersioner)
+#else
+#if MIN_VERSION_optparse_applicative(0,18,1)
+import Options.Applicative (simpleVersioner)
+#else
+import Options.Applicative (infoOption, long, help, hidden)
+#endif
+import Options.Applicative (Parser)
+#endif
+
+#if MIN_VERSION_optparse_applicative(0,19,0)
+#else
+-- Prior to optparse-applicative-0.19.0.0, option groups were not supported,
+-- so this definition simply drops the group.
+parserOptionGroup :: String -> Parser a -> Parser a
+parserOptionGroup _ p = p
+#if MIN_VERSION_optparse_applicative(0,18,1)
+#else
+-- Prior to optparse-applicative-0.18.1.0, simpleVersioner was not defined,
+-- so this definition is taken verbatim from optparse-applicative-0.18.1.0.
+simpleVersioner :: String -> Parser (a -> a)
+simpleVersioner version = infoOption version $
+  mconcat [long "version", help "Show version information", hidden]
+#endif
+#endif
