The following expressions work for me in PostgreSQL 9.1:
select ((-32768)::int2)::int4::bit(16);
==> X'8000'
select ((('X8000'::bit(16))::bit(32)::int4) >> 16)::int2;
==> -32768
EDIT: a bit of evidence that this works:
-- int2 to bit16 and back
create temp table test1 (x int2);
insert into test1 select generate_series(-32768,32767)::int2;
select x from test1 where x != ((x::int4::bit(16) ::bit(32)::int4) >> 16)::int2;
==> no rows selected
-- bit16 to int2 and back
create temp table test2 (x bit(16));
insert into test2 select generate_series(0,65536)::bit(16);
select x from test2 where x != (((x::bit(32)::int4)>>16)::int2) ::int4::bit(16);
==> no rows selected