diff --git a/dune/matrix-vector/algorithm.hh b/dune/matrix-vector/algorithm.hh
index b9817e04eff80307b0a0db69f2e77ef6c0f1f0a4..30d2cf0fe5049020ef8d717600d3dbf38ab87a01 100644
--- a/dune/matrix-vector/algorithm.hh
+++ b/dune/matrix-vector/algorithm.hh
@@ -6,29 +6,16 @@
 #include <type_traits>
 
 #include <dune/common/hybridutilities.hh>
-
-#include <dune/istl/multitypeblockmatrix.hh>
-#include <dune/istl/multitypeblockvector.hh>
+#include <dune/common/typetraits.hh>
 
 namespace Dune {
 namespace MatrixVector {
 
-template <class C>
-struct IsMultiTypeBlockContainer : public std::false_type {};
-
-template <class... Args>
-struct IsMultiTypeBlockContainer<MultiTypeBlockMatrix<Args...>>
-  : public std::true_type {};
-
-template <class... Args>
-struct IsMultiTypeBlockContainer<MultiTypeBlockVector<Args...>>
-  : public std::true_type {};
-
 /**
  * \brief Hybrid for loop over sparse range
  */
 template <class Range, class F,
-          typename = std::enable_if_t<IsMultiTypeBlockContainer<Range>::value>>
+          typename = std::enable_if_t<Dune::IsTupleOrDerived<Range>::value>>
 void rangeForEach(const Range& range, F&& f) {
   using namespace Dune::Hybrid;
   forEach(integralRange(size(range)), [&](auto&& i) { f(range[i], i); });