Using a composite primary key in which one column is completely dependent on the other column is an "interesting" design.
In any case, PostgreSQL currently assumes each column's selectivity is independent of each other and so multiplies them together (regardless of whether they are in the same index or not, even when it is a primary key index), and I don't know of a good way around that.
You can use this circumlocution to get closer to the true selectivity:
EXPLAIN ANALYZE
SELECT *
FROM t1 JOIN t2 on (t1.x=t2.x and t1.x2 between t2.x2 and t2.x2);