Use `sealed` when you need a closed set of variants that can carry different data and types (sum type). It enables exhaustive `when` checks, while `enum` is a fixed set of instances of one type.
sealed interface Result
data class Ok(val value: Int) : Result
data class Err(val message: String) : Result
fun handle(r: Result) = when (r) {
is Ok -> r.value
is Err -> 0
}