diff --git a/lib/private/EventDispatcher/EventDispatcher.php b/lib/private/EventDispatcher/EventDispatcher.php
index bbf6ae2b36871dd83601849f729741188f28f13d..8830bae79d8468b596904e6bb20e28c79113d389 100644
--- a/lib/private/EventDispatcher/EventDispatcher.php
+++ b/lib/private/EventDispatcher/EventDispatcher.php
@@ -31,6 +31,7 @@ use OCP\IContainer;
 use OCP\ILogger;
 use OCP\IServerContainer;
 use Symfony\Component\EventDispatcher\EventDispatcher as SymfonyDispatcher;
+use function get_class;
 
 class EventDispatcher implements IEventDispatcher {
 
@@ -74,6 +75,10 @@ class EventDispatcher implements IEventDispatcher {
 		$this->dispatcher->dispatch($event, $eventName);
 	}
 
+	public function dispatchTyped(Event $event): void {
+		$this->dispatch(get_class($event), $event);
+	}
+
 	/**
 	 * @return SymfonyDispatcher
 	 */
diff --git a/lib/public/EventDispatcher/IEventDispatcher.php b/lib/public/EventDispatcher/IEventDispatcher.php
index af4d5316a7b6cf2c629c71975d599d8234478d1e..630b7e3c8a0336d03d91a8f8791a425288b3fd64 100644
--- a/lib/public/EventDispatcher/IEventDispatcher.php
+++ b/lib/public/EventDispatcher/IEventDispatcher.php
@@ -58,4 +58,16 @@ interface IEventDispatcher {
 	 */
 	public function dispatch(string $eventName, Event $event): void;
 
+	/**
+	 * Dispatch a typed event
+	 *
+	 * Only use this with subclasses of ``\OCP\EventDispatcher\Event``.
+	 * The object's class will determine the event name.
+	 *
+	 * @param Event $event
+	 *
+	 * @since 18.0.0
+	 */
+	public function dispatchTyped(Event $event): void;
+
 }