type is just that limited. Using a struct here is the right solution (if you want to add your own impls). Note: You can add an impl for std::ops::Index and std::ops::IndexMut to regain the indexing operator.
This always bugs me. We don't seem to get first class support for matrices in general purpose languages. C, C++, Java, Python, Go, Rust - none take multidimensional arrays seriously enough. There's Matlab, but there, everything is an array.
There isn't a one-size fits-all solution to handling matrices. The algorithms for large, sparse matrices aren't good on small ones and vice versa. Then you've got SIMD and compute shaders to contend with. Do you need to reference submatrices? Do you need to efficient operations on column-order or row-order matrices? What would you expect a general purpose language to do to take this seriously? There are so many situational tradeoffs.
What is it that you are wishing for, arithmetic operators? If so, which ones, and what do you think they should do? I don't know of a single arithmetic operator that does the same thing on all languages that support arithmetic on arrays, so it's hard to see that there is some behavior that ought to be supported by default.
In case this isn't clear, the reason type is so limited is because it doesn't actually create a new type, only an alias. For the coherence checks on whether to allow impl, MyMatrix4 is still a foreign type, because it's completely identical to writing [[f32; 4]; 4] everywhere.