diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js
index a718e5404e94cb..4577d791d65229 100644
--- a/lib/internal/webstreams/readablestream.js
+++ b/lib/internal/webstreams/readablestream.js
@@ -28,6 +28,7 @@ const {
 } = primordials;
 
 const {
+  AbortError,
   codes: {
     ERR_ILLEGAL_CONSTRUCTOR,
     ERR_INVALID_ARG_VALUE,
@@ -1303,8 +1304,14 @@ function readableStreamPipeTo(
   }
 
   function abortAlgorithm() {
-    // Cannot use the AbortError class here. It must be a DOMException
-    const error = new DOMException('The operation was aborted', 'AbortError');
+    let error;
+    if (signal.reason instanceof AbortError) {
+      // Cannot use the AbortError class here. It must be a DOMException.
+      error = new DOMException(signal.reason.message, 'AbortError');
+    } else {
+      error = signal.reason;
+    }
+
     const actions = [];
     if (!preventAbort) {
       ArrayPrototypePush(
diff --git a/test/parallel/test-webstream-readablestream-pipeto.js b/test/parallel/test-webstream-readablestream-pipeto.js
new file mode 100644
index 00000000000000..95929c5197a275
--- /dev/null
+++ b/test/parallel/test-webstream-readablestream-pipeto.js
@@ -0,0 +1,24 @@
+// Flags: --expose-internals
+'use strict';
+
+require('../common');
+const assert = require('node:assert');
+const { AbortError } = require('internal/errors');
+
+// Purpose: pass an AbortError instance, which isn't the DOMException, as an
+// abort reason.
+
+for (const message of [undefined, 'abc']) {
+  const rs = new ReadableStream();
+  const ws = new WritableStream();
+  const ac = new AbortController();
+  const reason = new AbortError(message);
+  ac.abort(reason);
+
+  assert.rejects(rs.pipeTo(ws, { signal: ac.signal }), (e) => {
+    assert(e instanceof DOMException);
+    assert.strictEqual(e.name, 'AbortError');
+    assert.strictEqual(e.message, reason.message);
+    return true;
+  });
+}
diff --git a/test/wpt/status/streams.json b/test/wpt/status/streams.json
index 7f76e697a648a9..6f9a806a33abf1 100644
--- a/test/wpt/status/streams.json
+++ b/test/wpt/status/streams.json
@@ -2,15 +2,6 @@
   "piping/abort.any.js": {
     "fail": {
       "expected": [
-        "(reason: 'null') all the error objects should be the same object",
-        "(reason: 'undefined') all the error objects should be the same object",
-        "(reason: 'error1: error1') all the error objects should be the same object",
-        "(reason: 'null') abort should prevent further reads",
-        "(reason: 'undefined') abort should prevent further reads",
-        "(reason: 'error1: error1') abort should prevent further reads",
-        "(reason: 'null') all pending writes should complete on abort",
-        "(reason: 'undefined') all pending writes should complete on abort",
-        "(reason: 'error1: error1') all pending writes should complete on abort",
         "pipeTo on a teed readable byte stream should only be aborted when both branches are aborted"
       ]
     }