An analogy to slices might help. A lot of C code passes a pointer and a length, but experience has shown that this is more error-prone than is ideal. So we have a type which keeps those things together, and it’s better.
An index type establishes a relationship between two separate types, but it keeps the pieces together, not syntactically, but semantically. Can we do without it? Yes, is it worth having? I think so, yeah.