diff --git a/src/internal/testenv/testenv_unix.go b/src/internal/testenv/testenv_unix.go
index 92b5024f0b832548b782ffddf38a20e1bd1edda4..a629078842eadcbb904dd354fe5567ea8a28300f 100644
--- a/src/internal/testenv/testenv_unix.go
+++ b/src/internal/testenv/testenv_unix.go
@@ -24,11 +24,6 @@ func syscallIsNotSupported(err error) bool {
 	var errno syscall.Errno
 	if errors.As(err, &errno) {
 		switch errno {
-		case syscall.ENOSYS, syscall.ENOTSUP:
-			// Explicitly not supported.
-			// TODO(#41198): remove these cases when errors.Is reports that they are
-			// equivalent to ErrUnsupported.
-			return true
 		case syscall.EPERM, syscall.EROFS:
 			// User lacks permission: either the call requires root permission and the
 			// user is not root, or the call is denied by a container security policy.
diff --git a/src/syscall/syscall_js.go b/src/syscall/syscall_js.go
index c9c65229804c5df0c8501fbb4381d67dd5116c95..c1b28942e8e40e5e2f74bc6017edbfd86bf3058c 100644
--- a/src/syscall/syscall_js.go
+++ b/src/syscall/syscall_js.go
@@ -7,6 +7,7 @@
 package syscall
 
 import (
+	errorspkg "errors"
 	"internal/itoa"
 	"internal/oserror"
 	"sync"
@@ -47,8 +48,8 @@ const PathMax = 256
 //		err = errno
 //	}
 //
-// Errno values can be tested against error values from the os package
-// using errors.Is. For example:
+// Errno values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -72,6 +73,8 @@ func (e Errno) Is(target error) bool {
 		return e == EEXIST || e == ENOTEMPTY
 	case oserror.ErrNotExist:
 		return e == ENOENT
+	case errorspkg.ErrUnsupported:
+		return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP
 	}
 	return false
 }
diff --git a/src/syscall/syscall_plan9.go b/src/syscall/syscall_plan9.go
index 759f8051e860f3ab7cbdc2ddb1b4108664e995eb..7af10ba322a881cf450a82450539d5f83c9765b9 100644
--- a/src/syscall/syscall_plan9.go
+++ b/src/syscall/syscall_plan9.go
@@ -23,8 +23,8 @@ const bitSize16 = 2
 
 // ErrorString implements Error's String method by returning itself.
 //
-// ErrorString values can be tested against error values from the os package
-// using errors.Is. For example:
+// ErrorString values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go
index c59d4fcf958aa54f417479bd1f2c6a5047dece9b..4c48f29744a70ae61a909a1acc255624a0f788d8 100644
--- a/src/syscall/syscall_unix.go
+++ b/src/syscall/syscall_unix.go
@@ -7,6 +7,7 @@
 package syscall
 
 import (
+	errorspkg "errors"
 	"internal/bytealg"
 	"internal/itoa"
 	"internal/oserror"
@@ -97,8 +98,8 @@ func (m *mmapper) Munmap(data []byte) (err error) {
 //		err = errno
 //	}
 //
-// Errno values can be tested against error values from the os package
-// using errors.Is. For example:
+// Errno values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -122,6 +123,8 @@ func (e Errno) Is(target error) bool {
 		return e == EEXIST || e == ENOTEMPTY
 	case oserror.ErrNotExist:
 		return e == ENOENT
+	case errorspkg.ErrUnsupported:
+		return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP
 	}
 	return false
 }
diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go
index ae9b49a28d4ac7d071b7ef42512cbb84e0225947..fe052d7e72ed15dfdefd567d9eedd487c0d59416 100644
--- a/src/syscall/syscall_windows.go
+++ b/src/syscall/syscall_windows.go
@@ -103,8 +103,8 @@ func UTF16PtrFromString(s string) (*uint16, error) {
 
 // Errno is the Windows error number.
 //
-// Errno values can be tested against error values from the os package
-// using errors.Is. For example:
+// Errno values can be tested against error values using errors.Is.
+// For example:
 //
 //	_, _, err := syscall.Syscall(...)
 //	if errors.Is(err, fs.ErrNotExist) ...
@@ -147,17 +147,25 @@ const _ERROR_BAD_NETPATH = Errno(53)
 func (e Errno) Is(target error) bool {
 	switch target {
 	case oserror.ErrPermission:
-		return e == ERROR_ACCESS_DENIED
+		return e == ERROR_ACCESS_DENIED ||
+			e == EACCES ||
+			e == EPERM
 	case oserror.ErrExist:
 		return e == ERROR_ALREADY_EXISTS ||
 			e == ERROR_DIR_NOT_EMPTY ||
-			e == ERROR_FILE_EXISTS
+			e == ERROR_FILE_EXISTS ||
+			e == EEXIST ||
+			e == ENOTEMPTY
 	case oserror.ErrNotExist:
 		return e == ERROR_FILE_NOT_FOUND ||
 			e == _ERROR_BAD_NETPATH ||
-			e == ERROR_PATH_NOT_FOUND
+			e == ERROR_PATH_NOT_FOUND ||
+			e == ENOENT
 	case errorspkg.ErrUnsupported:
-		return e == EWINDOWS
+		return e == ENOSYS ||
+			e == ENOTSUP ||
+			e == EOPNOTSUPP ||
+			e == EWINDOWS
 	}
 	return false
 }