The underlying difference can be summed up as follows: Refinement types let you form subtypes of other types. This is important for two reasons. First, a full dependent type system, like in Idris, lets you write down all sorts of arbitrary inductive types, not just constrain other types. And second, refinement types are subtypes of the type they refine, and they have a subtyping relationship with each other.