I like most of this cleanup. I think we could leave the getQuick()/setQuick() methods as-is – no need for additional arg checking. Their intent is to be used when the caller knows it's OK.
I don't know that it's a problem that this allows different rows to be of different types. I don't think any caller uses it that way anyway.
It is interesting what "like" means for the method that specifies a new number of rows – what are the types of the new rows? Right now it forces them to DenseVector which doesn't feel right if the other like() method does not do the same. On the other hand, you're requesting a different number of rows, which means the type of new rows aren't defined anyway, so how much can the caller care?
I think the least surprising thing for the caller, who will normally have an object with all one type of vector, is to have a result of the same type of vector. So, in that sense I think your change is good.
But there isn't a need for a new likeVector() method; call Vector.like() as the other method does.
Let me see what happens under these changes.