I think faces, edges, vertices, etc are fine names to use, but generally should be defined in terms of the dimensionality of the main geometric type.
So e.g. for an N-cube we'd talk about the N-1-faces, N-2-edges, and N-3-vertices.
So the definition of e.g. the numFaces function shouldn't be numMCubes< 2 >(), it should be based on the dimensionality of the current type and be numMCubes< DIM - 1 >().
We can also have an absolute version numAdjacent< DIM >() which replicates the current implementation (which may get more use generally).