A nitpick: Types are properties of expressions, not values. Type errors happen at compile time, before code runs. Values only exist at run time.
In semantics, types are properties of values and expressions. Type safety is about whether the type of an expression always matches the type of the value it evaluates to.
Doesn’t this break down with dependent type systems?
Fair enough. Although I don't fully subscribe to the dichotomy of compile vs run time, we can say that.