diff --git a/doc/guix.texi b/doc/guix.texi
index f9ca809e47..eeb2efa488 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -20494,11 +20494,21 @@ Networking Services
 
 @cindex Tor
 @defvar tor-service-type
-This is the type for a service that runs the @uref{https://torproject.org,
-Tor} anonymous networking daemon.  The service is configured using a
+Type for a service that runs the @uref{https://torproject.org, Tor}
+anonymous networking daemon.  The service is configured using a
 @code{<tor-configuration>} record.  By default, the Tor daemon runs as the
 @code{tor} unprivileged user, which is a member of the @code{tor} group.
 
+In addition to adding Tor @dfn{hidden service}s records to the service
+configuration directly, this service can be extended by other services to add
+hidden services, as in this example:
+
+@lisp
+(simple-service 'my-extra-hidden-service tor-service-type
+                (list (tor-hidden-service-configuration
+                        (name "extra-hidden-service")
+                        (mapping '((80 "127.0.0.1:8080"))))))
+@end lisp
 @end defvar
 
 @deftp {Data Type} tor-configuration
@@ -20517,11 +20527,10 @@ Networking Services
 syntax.
 
 @item @code{hidden-services} (default: @code{'()})
-The list of @code{<hidden-service>} records to use.  For any hidden service
-you include in this list, appropriate configuration to enable the hidden
-service will be automatically added to the default configuration file.  You
-may conveniently create @code{<hidden-service>} records using the
-@code{tor-hidden-service} procedure described below.
+The list of @code{<tor-hidden-service-configuration>} records to use.
+For any hidden service you include in this list, appropriate
+configuration to enable the hidden service will be automatically added to
+the default configuration file.
 
 @item @code{socks-socket-type} (default: @code{'tcp})
 The default socket type that Tor should use for its SOCKS socket.  This must
@@ -20546,26 +20555,32 @@ Networking Services
 @end table
 @end deftp
 
-@cindex hidden service
-@deffn {Scheme Procedure} tor-hidden-service @var{name} @var{mapping}
-Define a new Tor @dfn{hidden service} called @var{name} and implementing
-@var{mapping}.  @var{mapping} is a list of port/host tuples, such as:
+@cindex hidden service, tor
+@deftp {Data Type} tor-hidden-service-configuration
+Data Type representing a Tor @dfn{hidden service} configuration.
+See @uref{https://www.torproject.org/docs/tor-hidden-service.html.en, the Tor
+project's documentation} for more information.
+
+@table @asis
+@item @code{name} (type: string)
+Name for the Tor @dfn{hidden service}.
+This creates a @file{/var/lib/tor/hidden-services/@var{name}} directory,
+where the @file{hostname} file contains the @samp{.onion} host name for
+the hidden service.
+
+@item @code{mapping} (type: list-of-list)
+List of host---@dfn{hidden-service} port mappings, such as:
 
 @example
- '((22 "127.0.0.1:22")
-   (80 "127.0.0.1:8080"))
+'((22 "127.0.0.1:22")
+  (80 "127.0.0.1:8080"))
 @end example
 
 In this example, port 22 of the hidden service is mapped to local port 22, and
 port 80 is mapped to local port 8080.
 
-This creates a @file{/var/lib/tor/hidden-services/@var{name}} directory, where
-the @file{hostname} file contains the @code{.onion} host name for the hidden
-service.
-
-See @uref{https://www.torproject.org/docs/tor-hidden-service.html.en, the Tor
-project's documentation} for more information.
-@end deffn
+@end table
+@end deftp
 
 The @code{(gnu services rsync)} module provides the following services:
 
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index dacf64c2d1..d6e1877ef5 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -138,7 +138,16 @@ (define-module (gnu services networking)
 
             tor-configuration
             tor-configuration?
-            tor-hidden-service
+            tor-configuration-tor
+            tor-configuration-config-file
+            tor-configuration-hidden-services
+            tor-configuration-socks-socket-type
+            tor-configuration-control-socket-path
+            tor-hidden-service-configuration
+            tor-hidden-service-configuration?
+            tor-hidden-service-configuration-name
+            tor-hidden-service-configuration-mapping
+            tor-hidden-service  ; deprecated
             tor-service-type
 
             network-manager-configuration
@@ -919,7 +928,7 @@ (define-record-type* <tor-configuration>
                     (default '()))
   (socks-socket-type tor-configuration-socks-socket-type ; 'tcp or 'unix
                      (default 'tcp))
-  (control-socket?  tor-control-socket-path
+  (control-socket?  tor-configuration-control-socket-path
                     (default #f)))
 
 (define %tor-accounts
@@ -933,11 +942,11 @@ (define %tor-accounts
          (home-directory "/var/empty")
          (shell (file-append shadow "/sbin/nologin")))))
 
-(define-record-type <hidden-service>
-  (hidden-service name mapping)
-  hidden-service?
-  (name    hidden-service-name)                   ;string
-  (mapping hidden-service-mapping))               ;list of port/address tuples
+(define-record-type <tor-hidden-service-configuration>
+  (tor-hidden-service-configuration name mapping)
+  tor-hidden-service-configuration?
+  (name    tor-hidden-service-configuration-name)      ;string
+  (mapping tor-hidden-service-configuration-mapping))  ;list of port/address tuples
 
 (define (tor-configuration->torrc config)
   "Return a 'torrc' file for CONFIG."
@@ -977,7 +986,7 @@ (define (tor-configuration->torrc config)
                                                 tcp-port host))
                                       ports hosts)))
                          '#$(map (match-lambda
-                                   (($ <hidden-service> name mapping)
+                                   (($ <tor-hidden-service-configuration> name mapping)
                                     (cons name mapping)))
                                  hidden-services))
 
@@ -1064,7 +1073,7 @@ (define (tor-activation config)
       (chmod "/var/lib" #o755)
 
       (for-each initialize
-                '#$(map hidden-service-name
+                '#$(map tor-hidden-service-configuration-name
                         (tor-configuration-hidden-services config)))))
 
 (define tor-service-type
@@ -1077,7 +1086,7 @@ (define tor-service-type
                        (service-extension activation-service-type
                                           tor-activation)))
 
-                ;; This can be extended with hidden services.
+                ;; This can be extended with tor hidden services.
                 (compose concatenate)
                 (extend (lambda (config services)
                           (tor-configuration
@@ -1090,15 +1099,8 @@ (define tor-service-type
                  "Run the @uref{https://torproject.org, Tor} anonymous
 networking daemon.")))
 
-(define tor-hidden-service-type
-  ;; A type that extends Tor with hidden services.
-  (service-type (name 'tor-hidden-service)
-                (extensions
-                 (list (service-extension tor-service-type list)))
-                (description
-                 "Define a new Tor @dfn{hidden service}.")))
-
-(define (tor-hidden-service name mapping)
+(define-deprecated (tor-hidden-service name mapping)
+  #f
   "Define a new Tor @dfn{hidden service} called @var{name} and implementing
 @var{mapping}.  @var{mapping} is a list of port/host tuples, such as:
 
@@ -1116,8 +1118,11 @@ (define (tor-hidden-service name mapping)
 
 See @uref{https://www.torproject.org/docs/tor-hidden-service.html.en, the Tor
 project's documentation} for more information."
-  (service tor-hidden-service-type
-           (hidden-service name mapping)))
+  (simple-service 'tor-hidden-service
+                  tor-service-type
+                  (list (tor-hidden-service-configuration
+                         (name name)
+                         (mapping mapping)))))
 
 
 ;;;
