diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6bf56c4e30..bc31281db5 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -712,7 +712,7 @@ jobs:
include:
- python: 3.9
- args: -DCMAKE_CXX_STANDARD=20 -DDOWNLOAD_EIGEN=OFF
+ args: -DCMAKE_CXX_STANDARD=20
- python: 3.8
args: -DCMAKE_CXX_STANDARD=17
@@ -835,7 +835,7 @@ jobs:
cmake -S . -B build
-DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON
- -DDOWNLOAD_EIGEN=OFF
+ -DDOWNLOAD_EIGEN=ON
-DCMAKE_CXX_STANDARD=20
- name: Build C++20
diff --git a/include/pybind11/detail/common.h b/include/pybind11/detail/common.h
index 1070d686ec..1d4939bed7 100644
--- a/include/pybind11/detail/common.h
+++ b/include/pybind11/detail/common.h
@@ -822,7 +822,9 @@ struct is_template_base_of_impl {
/// Check if a template is the base of a type. For example:
/// `is_template_base_of` is true if `struct T : Base {}` where U can be anything
template class Base, typename T>
-#if defined(PYBIND11_CPP20) || !defined(_MSC_VER) // Sadly, all MSVC versions incl. 2022 need this.
+// Sadly, all MSVC versions incl. 2022 need the workaround, even in C++20 mode.
+// See also: https://github.com/pybind/pybind11/pull/3741
+#if !defined(_MSC_VER)
using is_template_base_of
= decltype(is_template_base_of_impl::check((intrinsic_t *) nullptr));
#else
diff --git a/include/pybind11/eigen.h b/include/pybind11/eigen.h
index 47820ce895..930c4f7fa8 100644
--- a/include/pybind11/eigen.h
+++ b/include/pybind11/eigen.h
@@ -21,10 +21,12 @@
// make it version specific, or even remove it later, but considering that
// 1. C4127 is generally far more distracting than useful for modern template code, and
// 2. we definitely want to ignore any MSVC warnings originating from Eigen code,
-// it is probably best to keep this around indefinitely.
+// it is probably best to keep this around indefinitely.
#if defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable : 4127) // C4127: conditional expression is constant
+# pragma warning(disable : 5054) // https://github.com/pybind/pybind11/pull/3741
+// C5054: operator '&': deprecated between enumerations of different types
#endif
#include