diff --git a/CHANGELOG.md b/CHANGELOG.md
index 88060895e173d69068a3d51c989364505ab6f527..e963353581819d81121848f8fc9c34d06e59cb46 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,12 @@
   Furthermore, flags for either shared library or position independent code
   needs to be used.
 
+- The class `AxisAlignedCubeGeometry` has always had a constructor taking
+  two arguments `FieldVector<ctype,coorddim> lower` and `FieldVector<ctype,coorddim> upper`.
+  This constructor was always to be used in the case `dim==coorddim` only,
+  but this was never enforced.  Starting with version 2.8, compilation
+  fails with an error message if this constructor is used with `dim!=coorddim`.
+
 ## Deprecations and removals
 
 - Remove code needed to use reference elements by reference.
diff --git a/dune/geometry/axisalignedcubegeometry.hh b/dune/geometry/axisalignedcubegeometry.hh
index b4d6ca09d28ccadd625af7f782b6ffc8c361bbad..65df510e09220911b98d4c19777464877cbb5e8d 100644
--- a/dune/geometry/axisalignedcubegeometry.hh
+++ b/dune/geometry/axisalignedcubegeometry.hh
@@ -99,6 +99,7 @@ namespace Dune {
         upper_(upper),
         axes_()
     {
+      static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!");
       // all 'true', but is never actually used
       axes_ = (1<<coorddim)-1;
     }
diff --git a/dune/geometry/refinement/hcube.cc b/dune/geometry/refinement/hcube.cc
index 27855e7ccb2c9f9acd8ea202e44f3b94c5423caa..9c92fc9a91333d8d5cc0f33fb6d53b4d3c6f3af7 100644
--- a/dune/geometry/refinement/hcube.cc
+++ b/dune/geometry/refinement/hcube.cc
@@ -397,19 +397,22 @@ namespace Dune
 
         assert(codimension == 0 or codimension == dimension);
 
-        if (codimension == 0) {
+        if constexpr (codimension == 0) {
           for (size_t j = 0; j < dimension; j++)
           {
             lower[j] = double(intCoords[j])     / double(_nIntervals);
             upper[j] = double(intCoords[j] + 1) / double(_nIntervals);
           }
+
+          return typename RefinementImp<dimension,
+                                        CoordType>::template Codim<codimension>::Geometry(lower,upper);
         } else {
           for (size_t j = 0; j < dimension; j++)
             lower[j] = upper[j] = double(intCoords[j]) / double(_nIntervals);
-        }
 
-        return typename RefinementImp<dimension,
-            CoordType>::template Codim<codimension>::Geometry(lower,upper);
+          return typename RefinementImp<dimension,
+                                        CoordType>::template Codim<codimension>::Geometry(lower,upper,std::bitset<dimension>(0));
+        }
       }
 
 #endif // DOXYGEN
diff --git a/dune/geometry/test/test-axisalignedcubegeometry.cc b/dune/geometry/test/test-axisalignedcubegeometry.cc
index ec932545caaed10c99705c04e8d109d70f4d5d64..2ec10cd9c011bfb23defda47a03230d11eec0db2 100644
--- a/dune/geometry/test/test-axisalignedcubegeometry.cc
+++ b/dune/geometry/test/test-axisalignedcubegeometry.cc
@@ -58,8 +58,11 @@ void testCodimZero(int& result)
 
   FieldVector<double,coorddim> lower(0);
   FieldVector<double,coorddim> upper(1);
+  std::bitset<coorddim> axes(0);
+  for (int i=0; i<dim; i++)
+    axes[i] = true;
 
-  ElementGeometry geometry( lower, upper );
+  ElementGeometry geometry( lower, upper, axes );
 
   if (checkGeometry(geometry))
     pass(result);
@@ -69,7 +72,7 @@ void testCodimZero(int& result)
   testBasicGeometryAffine(geometry, result);
 
   // test assignability
-  ElementGeometry geometry2( lower, upper );
+  ElementGeometry geometry2( lower, upper, axes );
   geometry2 = geometry;
 }