Join table into different columns
Assuming Postgres 9.4 or later:

SELECT id, t2.table2value0, t2.table2value1, t2.table2othervalues
FROM   table1 t1
LEFT   JOIN (
   SELECT table1_id AS id
        , min(value) FILTER (WHERE type = 0) AS table2value0
        , min(value) FILTER (WHERE type = 1) AS table2value1
        , array_agg(value) FILTER (WHERE type IN (1,2) IS NOT TRUE) AS table2othervalues
   FROM   table2
   GROUP  BY table1_id
   ) t2 USING (id);


The aggregate FILTER clause was introduced with pg 9.4. There are various less elegant alternatives for older versions:


Postgres Nested WHEN Aggregate Function


This returns one row for every row in table1, missing types in table2 result in NULL values.


  If there are more than one value for table2value0 and table2value1, I only want the first.


You seem to be under the impression that there is a natural order of rows, but there is not:


Does Postgres preserve insertion order of records?


I picked the minimum value instead, since your requirement is effectively undefined. 

The best query depends on your actual table definition (including all constraints).

In particular, the expression type IN (1,2) IS NOT TRUE also catches type IS NULL, which may not be necessary, depending on your missing table definition.

Related:


Select column to be inserted based on input column value
How to pass a parameter into a function


Aside:
Your desire to return a single (scalar) value for types 1 and 2, but an array for the rest makes it harder to solve with crosstab() (but still possible). Basics:


PostgreSQL Crosstab Query