Do we need to provide lazy casting/parsing? That is, instead of eagerly casting, instead return delegating (and probably memoizing) implementations of the returned type that only cast on reads.
It's not clear that laziness makes sense for the parsing case, but it's possible. For the cast conversion case, converting lazily would be beneficial when reads are sparse, but harmful when reads are dense.