diff --git a/R/geom-linerange.R b/R/geom-linerange.R
index 0d67908ec8..0ea5b93334 100644
--- a/R/geom-linerange.R
+++ b/R/geom-linerange.R
@@ -27,11 +27,18 @@ GeomLinerange <- ggproto(
     data
   },
 
-  draw_panel = function(data, panel_params, coord, lineend = "butt", flipped_aes = FALSE, na.rm = FALSE) {
+  draw_panel = function(data, panel_params, coord, lineend = "butt",
+                        flipped_aes = FALSE, na.rm = FALSE,
+                        arrow = NULL, arrow.fill = NULL) {
     data <- flip_data(data, flipped_aes)
     data <- transform(data, xend = x, y = ymin, yend = ymax)
     data <- flip_data(data, flipped_aes)
-    ggname("geom_linerange", GeomSegment$draw_panel(data, panel_params, coord, lineend = lineend, na.rm = na.rm))
+    grob <- GeomSegment$draw_panel(
+      data, panel_params, coord,
+      lineend = lineend, na.rm = na.rm,
+      arrow = arrow, arrow.fill = arrow.fill
+    )
+    ggname("geom_linerange", grob)
   },
 
   rename_size = TRUE
@@ -55,6 +62,7 @@ GeomLinerange <- ggproto(
 #' @export
 #' @inheritParams layer
 #' @inheritParams geom_bar
+#' @inheritParams geom_segment
 #' @examples
 #' # Create a simple example dataset
 #' df <- data.frame(
diff --git a/R/geom-pointrange.R b/R/geom-pointrange.R
index 9029805aa4..7d9bcbf6d4 100644
--- a/R/geom-pointrange.R
+++ b/R/geom-pointrange.R
@@ -31,23 +31,24 @@ GeomPointrange <- ggproto("GeomPointrange", Geom,
   },
 
   draw_panel = function(data, panel_params, coord, lineend = "butt", fatten = 4,
-                        flipped_aes = FALSE, na.rm = FALSE) {
+                        flipped_aes = FALSE, na.rm = FALSE,
+                        arrow = NULL, arrow.fill = NULL) {
     line_grob <- GeomLinerange$draw_panel(
       data, panel_params, coord, lineend = lineend, flipped_aes = flipped_aes,
-      na.rm = na.rm
+      na.rm = na.rm, arrow = arrow, arrow.fill = arrow.fill
     )
-    if (is.null(data[[flipped_names(flipped_aes)$y]]))
+
+    skip_point <- is.null(data[[flipped_names(flipped_aes)$y]])
+    if (skip_point) {
       return(line_grob)
+    }
 
-    ggname("geom_pointrange",
-      gTree(children = gList(
-        line_grob,
-        GeomPoint$draw_panel(
-          transform(data, size = size * fatten),
-          panel_params, coord, na.rm = na.rm
-        )
-      ))
+    point_grob <- GeomPoint$draw_panel(
+      transform(data, size = size * fatten),
+      panel_params, coord, na.rm = na.rm
     )
+    grob <- gTree(children = gList(line_grob, point_grob))
+    ggname("geom_pointrange", grob)
   }
 )
 
diff --git a/man/geom_linerange.Rd b/man/geom_linerange.Rd
index 311748dd98..48d76fc13f 100644
--- a/man/geom_linerange.Rd
+++ b/man/geom_linerange.Rd
@@ -53,6 +53,8 @@ geom_linerange(
   ...,
   orientation = NA,
   lineend = "butt",
+  arrow = NULL,
+  arrow.fill = NULL,
   na.rm = FALSE,
   show.legend = NA,
   inherit.aes = TRUE
@@ -67,6 +69,8 @@ geom_pointrange(
   orientation = NA,
   fatten = deprecated(),
   lineend = "butt",
+  arrow = NULL,
+  arrow.fill = NULL,
   na.rm = FALSE,
   show.legend = NA,
   inherit.aes = TRUE
@@ -179,6 +183,11 @@ that define both data and aesthetics and shouldn't inherit behaviour from
 the default plot specification, e.g. \code{\link[=annotation_borders]{annotation_borders()}}.}
 
 \item{lineend}{Line end style (round, butt, square).}
+
+\item{arrow}{specification for arrow heads, as created by \code{\link[grid:arrow]{grid::arrow()}}.}
+
+\item{arrow.fill}{fill colour to use for the arrow head (if closed). \code{NULL}
+means use \code{colour} aesthetic.}
 }
 \description{
 Various ways of representing a vertical interval defined by \code{x},
diff --git a/tests/testthat/_snaps/function-args.md b/tests/testthat/_snaps/function-args.md
index 32101d9cb9..379efb5c2e 100644
--- a/tests/testthat/_snaps/function-args.md
+++ b/tests/testthat/_snaps/function-args.md
@@ -3,18 +3,20 @@
     Code
       problems
     Output
-       [1] "GeomBoxplot  : `notch` with `notchwidth`"
-       [2] "GeomContour  : `arrow` with `arrow.fill`"
-       [3] "GeomCurve    : `arrow` with `arrow.fill`"
-       [4] "GeomDensity2d: `arrow` with `arrow.fill`"
-       [5] "GeomFunction : `arrow` with `arrow.fill`"
-       [6] "GeomLine     : `arrow` with `arrow.fill`"
-       [7] "GeomPath     : `arrow` with `arrow.fill`"
-       [8] "GeomQuantile : `arrow` with `arrow.fill`"
-       [9] "GeomSegment  : `arrow` with `arrow.fill`"
-      [10] "GeomSf       : `arrow` with `arrow.fill`"
-      [11] "GeomSpoke    : `arrow` with `arrow.fill`"
-      [12] "GeomStep     : `arrow` with `arrow.fill`"
+       [1] "GeomBoxplot   : `notch` with `notchwidth`"
+       [2] "GeomContour   : `arrow` with `arrow.fill`"
+       [3] "GeomCurve     : `arrow` with `arrow.fill`"
+       [4] "GeomDensity2d : `arrow` with `arrow.fill`"
+       [5] "GeomFunction  : `arrow` with `arrow.fill`"
+       [6] "GeomLine      : `arrow` with `arrow.fill`"
+       [7] "GeomLinerange : `arrow` with `arrow.fill`"
+       [8] "GeomPath      : `arrow` with `arrow.fill`"
+       [9] "GeomPointrange: `arrow` with `arrow.fill`"
+      [10] "GeomQuantile  : `arrow` with `arrow.fill`"
+      [11] "GeomSegment   : `arrow` with `arrow.fill`"
+      [12] "GeomSf        : `arrow` with `arrow.fill`"
+      [13] "GeomSpoke     : `arrow` with `arrow.fill`"
+      [14] "GeomStep      : `arrow` with `arrow.fill`"
 
 # StatXxx$parameters() does not contain partial matches