Mysql LEFT JOINing same table twice
Perhaps it is easiest to see why this is happening by removing the aggregate functions:

SELECT c.name
     , dogs.quant
     , cats.quant
FROM customers AS c  
LEFT JOIN purchases AS dogs 
    ON c.id=dogs.owner_id 
    AND dogs.type = 'dog'     
LEFT JOIN purchases AS cats 
    ON c.id=cats.owner_id 
    AND cats.type = 'cat'     

+------+-------+-------+
| name | quant | quant |
+------+-------+-------+
| Matt |     1 |     4 |
| Matt |     2 |     4 |
| John |  NULL |     3 |
| John |  NULL |     2 |
+------+-------+-------+


You get a "multiplier effect" since you are joining the purchase table twice. Here's an alternative solution:

SELECT c.name
    , sum(case when type = 'dog' then quant end) AS dogs
    , sum(case when type = 'cat' then quant end) AS cats 
FROM customers AS c  
JOIN purchases p
    ON c.id=p.owner_id    
GROUP BY c.name;