Even well-typed programs can go wrong,
by returning a wrong answer or 
throwing a run-time error.
A popular response is
to allow programmers use
\textit{refinement type systems}
to express semantic specifications 
about programs.
%
We study verification in such systems.
%
On the one hand, expressive refinement type systems
require run-time checks
or explicit proofs to verify specifications.
On the other,
less expressive type systems
allow static and automatic proofs of the specifications.
%
Next, we present abstract refinement types, 
a means to enhance the expressiveness of
a refinement type system without increasing its complexity.
Then,  we present \toolname
that combines liquidTypes with abstraction over refinements
to enhance expressiveness of LiquidTypes.
\toolname is a quite expressive verification tool for Haskell programs 
that can be used to check termination, 
totality  and general functional correctness.
Finally, we evaluate \toolname in real world Haskell libraries.