Rotate table for year-over-year comparison
Yes, more concise ways of pivoting exist for your scenario.
Option 1
For instance, you could use the PIVOT operator:
SELECT
  *
FROM
  (
    SELECT
      road_id,
      insp_year,
      condition
    FROM
      road_insp
  ) derived
  PIVOT
  (
    MAX(condition)
    FOR insp_year IN
    (
      2009 AS condition_2009,
      2010 AS condition_2010,
      2011 AS condition_2011,
      2012 AS condition_2012,
      2013 AS condition_2013
    )
  )
;

PIVOT implies grouping, which is why you can see the MAX() aggregate function applied to condition rather than simply using condition.
The implicit grouping is also the reason you often need to use a derived table before applying the PIVOT operator: all columns not mentioned in the PIVOT clause actually participate in grouping, so you need to exclude those that are not supposed to be grouping criteria. For your specific example you do need a derived table, because you need to exclude insp_id.
Option 2
As an alternative to the PIVOT operator, you could try the old-school conditional aggregation method:
SELECT
  road_id,
  MAX(DECODE(insp_year, 2009, condition, NULL)) AS condition_2009,
  MAX(DECODE(insp_year, 2010, condition, NULL)) AS condition_2010,
  MAX(DECODE(insp_year, 2011, condition, NULL)) AS condition_2011,
  MAX(DECODE(insp_year, 2012, condition, NULL)) AS condition_2012,
  MAX(DECODE(insp_year, 2013, condition, NULL)) AS condition_2013
FROM
  road_insp
GROUP BY
  road_id
;

In this case there is no need to derive a table, as columns you want to group by can be explicitly specified in the GROUP BY clause.
—————————
Both methods produce the same output, identical to the one that your joining method generates, as can be seen in this demo at dbfiddle.uk.